gpt4 book ai didi

.net - 将 InterceptionBehaviour 添加到 IoC 容器中注册的所有内容

转载 作者:行者123 更新时间:2023-12-01 23:48:21 25 4
gpt4 key购买 nike

我有一个 Unity 容器,里面有很多注册,这些注册被截获用于记录。

有没有办法让我贪婪地将拦截器添加到每个 注册?感觉像 Ctrl-C, Ctrl+V 过载。

var container =  new UnityContainer();

container
.AddNewExtension<Interception>()
.RegisterType<IDummy1, Dummy1>(new Interceptor<InterfaceInterceptor>(), loggingInterceptionBehavior)
.RegisterType<IDummy2, Dummy2>(new Interceptor<InterfaceInterceptor>(), loggingInterceptionBehavior)
.RegisterType<IDummy3, Dummy3>(new Interceptor<InterfaceInterceptor>(), loggingInterceptionBehavior)
.RegisterType<IDummy4, Dummy4>(new Interceptor<InterfaceInterceptor>(), loggingInterceptionBehavior)
.RegisterType<IDummy5, Dummy5>(new Interceptor<InterfaceInterceptor>(), loggingInterceptionBehavior)

我看过下面的例子here ,使用 XML 配置:

<configuration>
<configSections>
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration, Version=2.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</configSections>
<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
<sectionExtension type="Microsoft.Practices.Unity.InterceptionExtension.Configuration.InterceptionConfigurationExtension, Microsoft.Practices.Unity.Interception.Configuration" />
<!-- Using Interception -->
<container name="Interception">
<extension type="Interception" />
<register type="AopTest.ILogger, AopTest" mapTo="AopTest.Logger, AopTest" />
<register type="AopTest.ICalculator, AopTest" mapTo="AopTest.Calculator, AopTest" />
<interceptor type="InterfaceInterceptor" />
<interceptionBehavior type="Infrastructure.LoggingInterceptionBehavior, Infrastructure" />
</register>
</container>
</configuration>

我假设为 AopTest.ILoggerAopTest.ICalculator 注册了 Infrastructure.LoggingInterceptionBehavior。 (?)

我如何在代码中做到这一点?

最佳答案

您可以尝试使用 convention based registrations ,因此您可以使用约定注册所有这些类型并一次添加拦截行为:

var container = new UnityContainer()
.AddNewExtension<Interception>()
.RegisterTypes(
AllClasses.FromAssemblies(typeof(IDummy1).Assembly),
WithMappings.FromMatchingInterface,
WithName.Default,
WithLifetime.ContainerControlled,
getInjectionMembers: c => new InjectionMember[]
{
new Interceptor<InterfaceInterceptor>(),
new InterceptionBehavior<LoggingInterceptor>()
});

WithMappings.FromMatchingInterface 约定将注册名称遵循给定接口(interface) IService 的约定的任何类型,实现它的类被命名为 Service。因此,您现在可以解析任何 IDummy1IDummy2IFoo 等,并且将应用 LoggingInterceptor 行为。

您可以在 this fiddle 中试用示例

编辑:澄清一下,正如 BanksySAN 评论的那样,这仅在 Unity >= 3 中可用。对于 Unity 2,可能有用于基于约定的配置的外部包,如 this one这可能会有帮助,但我自己还没有尝试过。最坏的情况是您可以推出自己的代码...

关于.net - 将 InterceptionBehaviour 添加到 IoC 容器中注册的所有内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27907790/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com