是否可以使用 InjectionConstructor 配置自定义拦截行为?换句话说,你如何告诉 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 所指出的,拦截行为类可以像任何其他类一样注册到容器中。对于我希望使用不同的跟踪开关进行跟踪拦截的每一层,我只需为拦截行为设置一个命名注册。下面的代码将用于服务层。使用不同名称和 traceswitch 配置的控制器和存储库也有类似的注册。
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")
}
);