是否可以使用InjectionConstructor配置自定义InterceptionBehavior?换句话说,你如何告诉Unity在你的InterceptionBehavior上使用哪个构造函数。
为了跟踪我们应用程序中的方法流程,我目前有四个处理跟踪的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;
}
据我了解,如果使用旧版Unity中的PolicyInjection和CallHandler,例如以下示例,则可以实现这一点,但我对如何使用新版本的Unity感到茫然。
container.Configure<Interception>()
.AddPolicy("SomePolicyName")
.AddCallHandler<SomeCustomInterceptor>(
new InjectionConstructor(new ResolvedParameter<SomeType>(), new ResolvedParameter<SomeType2>());
更新
正如下面的@DanielJ.G所指出的,拦截行为类可以像任何其他类一样注册到容器中。对于我想要使用不同跟踪开关进行跟踪拦截的每个层,我只是为拦截行为设置了一个命名注册。以下代码适用于服务层。控制器和存储库有类似的注册,使用不同的名称和tracewitch配置。
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")
}
);
答案 0 :(得分:2)
您可以将TraceInterceptionBehavior
配置为Unity中的任何已注册类型,因此您可以将以下内容添加到容器注册中:
container.RegisterType<TraceInterceptionBehavior>(
new InjectionConstructor(new ResolvedParameter<ITracer>(),
TraceSwitches.ServiceBegin,
TraceSwitches.ServiceEnd));
您在this fiddle中有完整的示例。