2011-10-12 33 views
2

說我們有:C#團結容器注射構造函數

class A 
{ 
    ILogger myLog; 
    A(ILogger log) 
    { 
     this.myLog = log; 
    } 
... 
} 

,我們在統一的容器,例如之前註冊的ILogger接口

container.RegisterType<ILogger, SomeLogger>(); 

而這裏SomeLogger類:

class SomeLogger : ILogger 
{ 
    string myString; 
    SomeLogger(string test) 
    { 
    myString = test; 
    } 
... 
} 

現在,如何統一創建A級SomeLogger的實例,而沒有經過串SomeLogger的構造函數? 假設SomeLogger沒有其他控制器。哪裏可以指定映射的SomeLogger類型的ctor的參數?

回答

1

你也可以做到這一點的註冊代碼如下:

UnityContainer.RegisterType<ILogger, SomeLogger>(); 
UnityContainer.Configure<InjectedMembers>() 
       .ConfigureInjectionFor<SomeLogger>(new InjectionConstructor("TestString")); 
+0

非常感謝,這正是我所期待的。在我的具體問題中,我有一個WFC回調類,WCF客戶端需要一個實例上下文。到目前爲止,我並不知道將這個實例上下文傳遞給WCF客戶端映射的統一容器。 – Juergen

+1

RegisterType的重載需要一個參數InjectionMember [],您可以使用它直接在InjectionConstrutor中傳遞。無需分別調用配置。 – BFree

+0

如果不提供統一容器的字符串參數,會發生什麼情況?運行時間消失? – Juergen

2

你可以在你的配置:

<?xml version="1.0"?> 
<configuration> 
    <configSections> 
     <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration" /> 
    </configSections> 
    <unity> 
     <containers> 
      <container> 
       <types> 
        <type type="[Namespace].ILogger, [AssemblyName]" mapTo="[Namespace].SomeLogger, [AssemblyName]"> 
         <constructor> 
          <param name="test"> 
           <value value="MyDesiredValue" /> 
          </param> 
         </constructor> 
        </type> 
       </types> 
      </container> 
     </containers> 
    </unity> 
</configuration> 

這也聲明註冊您的類型,所以

container.RegisterType<ILogger, SomeLogger>(); 

通話不再是必要的。

-Doug

+0

感謝這個例子。如何在代碼中指定這個? doumentation只針對注入類型討論ctor參數,而不針對接口的映射類型。 – Juergen

2

你可以這樣做:

container.RegisterType<ILogger, SomeLogger>(new InjectionConstructor("myStringValue"));