使用InjectionConstructor的Unity InterceptionBehavior

时间:2014-11-07 14:49:58

标签: unity-container unity-interception

是否可以使用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")
        }
    );

1 个答案:

答案 0 :(得分:2)

您可以将TraceInterceptionBehavior配置为Unity中的任何已注册类型,因此您可以将以下内容添加到容器注册中:

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

您在this fiddle中有完整的示例。