2

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

1 回答 1

2

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

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

你在这个小提琴中有一个完整的样本。

于 2014-11-07T15:27:19.643 回答