2

我有一個Unity容器,其中包含許多註冊,這些註冊將被攔截以進行日誌記錄。將InterceptionBehaviour添加到在IoC容器中註冊的所有內容

有沒有辦法我可以貪心地加上攔截器到註冊?感覺像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> 

我假設寄存器Infrastructure.LoggingInterceptionBehavior兩個AopTest.ILoggerAopTest.ICalculator。 (?)

我怎麼能在代碼中做到這一點?

+0

鏈接示例使用名稱匹配規則。還有一個使用名稱空間匹配規則(NamespaceMatchingRule)。您可以註冊您的主命名空間,並且該命名空間下的所有註冊實現將被攔截。 – Wizact

回答

2

你可以嘗試使用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公約將註冊任何類型,其中名稱遵循慣例給定接口IService實現它的類名爲Service。因此,您現在可以解決IDummy1,IDummy2,IFoo等中的任何一個,並且將應用LoggingInterceptor行爲。

可以在this fiddle

編輯嘗試的例子:我想弄清楚它,因爲BanksySAN評論說,這只是在Unity可用> = 3,對於Unity 2有可能是像以公約爲基礎配置外部包this one這可能是有幫助的但我沒有嘗試過。最壞的情況下,你可以推出自己的代碼...

+0

非常感謝Daniel,對我來說,我們使用的是Unity 2,該功能是Unity 3.我想我可以製作一個註冊幫助程序來執行此操作。 – BanksySan

+0

Unity Unity 5.7中不再存在'IUnityContainer.RegisterTypes'! –