Возможно ли настроить пользовательское 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")
}
);
Благодарим за то, что вы указали мне в правильном направлении. Поскольку я хочу настроить свой собственный перехватчик трассировки по-разному для каждого уровня, я закончил регистрацию моего «TraceInterceptionBehavior» для каждого уровня с использованием именованной регистрации. – Andrew