2014-11-07 5 views
2

Возможно ли настроить пользовательское InterceptionBehavior с InjectionConstructor? Другими словами, как вы сообщаете Unity, какой конструктор использует ваш InterceptionBehavior.Unity InterceptionBehavior with InjectionConstructor

Чтобы отслеживать поток методов в нашем приложении, в настоящее время у меня есть четыре класса InterceptionBehavior, которые касаются трассировки. Единственное различие между ними - TraceSwitch, который они используют для настройки трассировки, поэтому мы можем включать/отключать трассировку в разных слоях. Я хотел бы иметь только один пользовательский TraceInterceptionBehavior, который я мог бы использовать ConstructorInjection, чтобы установить TraceSwitches.

Что-то вроде этого (пример только, не компилируется). В этом случае я зарегистрирую бизнес-услуги в контейнере. Там бы аналогичные регистрации для других слоев, таких как контроллеры и хранилищ и т.д.

container.RegisterTypes(
    serviceTypes, 
    WithMappings.FromMatchingInterface, 
    getLifetimeManager: WithLifetime.ContainerControlled, 
    getInjectionMembers: c => new InjectionMember[] 
    { 
     new Interceptor<InterfaceInterceptor>(), 
     new InterceptionBehavior<TraceInterceptionBehavior>(
     // this is how I would do it if interception behavior supported constructor injection 
        new InjectionConstructor(new ResolvedParameter<ITracer>(), 
              TraceSwitches.ServiceBegin, 
              TraceSwitches.ServiceEnd)) 

      }); 
    } 

Конструктор пользовательского TraceInterceptionBehavior, что я пытаюсь позвонить:

public TraceInterceptionBehavior(ITracer tracer, TraceSwitch traceSwitchBegin, TraceSwitch traceSwitchEnd) : this(tracer) 
{ 
    TraceSwitchBegin = traceSwitchBegin; 
    TraceSwitchEnd = traceSwitchEnd; 
} 

Как я понимаю, это возможно если вы используете PolicyInjection и CallHandler из более старого Unity, например, следующий пример, но я не понимаю, как это сделать с новой версией Unity.

container.Configure<Interception>() 
.AddPolicy("SomePolicyName") 
.AddCallHandler<SomeCustomInterceptor>(
    new InjectionConstructor(new ResolvedParameter<SomeType>(), new ResolvedParameter<SomeType2>()); 

Update

Как отметил @ DanielJ.G ниже, класс поведение перехвата может быть зарегистрирован в контейнер так же, как и любой другой класс. Для каждого уровня, в котором я хочу использовать перехват трассировки с помощью другого переключателя трассировки, я просто установил именованную регистрацию для поведения перехвата. Ниже приведен код для уровня обслуживания. Аналогичные регистрации для контроллеров и репозиториев используются с использованием другого имени и конфигурации трассировки.

container.RegisterType<TraceInterceptionBehavior>("ServiceTraceInterceptionBehavior", 
    new ContainerControlledLifetimeManager(), 
    new InjectionConstructor(new ResolvedParameter<ITracer>(), 
    TraceSwitches.ServiceBegin, 
    TraceSwitches.ServiceEnd)); 

container.RegisterTypes(
    serviceTypes, 
    WithMappings.FromMatchingInterface, 
    getLifetimeManager: WithLifetime.ContainerControlled, 
    getInjectionMembers: c => 
    new InjectionMember[] 
     { 
      new Interceptor<InterfaceInterceptor>(), 
      new InterceptionBehavior<TraceInterceptionBehavior> "ServiceTraceInterceptionBehavior") 
     } 
    ); 

ответ

2

Вы можете настроить TraceInterceptionBehavior, как если бы это были какие-либо из зарегистрированных типов в Unity, так что вы можете добавить следующую строку в ваш контейнер регистрации:

container.RegisterType<TraceInterceptionBehavior>(
    new InjectionConstructor(new ResolvedParameter<ITracer>(), 
          TraceSwitches.ServiceBegin, 
          TraceSwitches.ServiceEnd)); 

У вас есть полный образец в this fiddle.

+0

Благодарим за то, что вы указали мне в правильном направлении. Поскольку я хочу настроить свой собственный перехватчик трассировки по-разному для каждого уровня, я закончил регистрацию моего «TraceInterceptionBehavior» для каждого уровня с использованием именованной регистрации. – Andrew

 Смежные вопросы

  • Нет связанных вопросов^_^