2009-10-02 30 views
3

我正在使用Unity依賴注入框架。 我有兩個類,每個都在構造函數中使用相同的委託參數。解決問題時,每個班級都應該有不同的方法。 我可以在不使用屬性的情況下設置它嗎?如果不是,你將如何使用屬性來做到這一點?團結和代表

回答

3

是的,你可以使用[Dependency]屬性修飾屬性或構造函數參數。

這個例子不使用的代表,它只是使用一個接口來代替,但它顯示了兩個相同的接口被用不同的名字註冊,並且要求類的構造函數中的特定的一個:

[TestClass] 
    public class NamedCI 
    { 
     internal interface ITestInterface 
     { 
      int GetValue(); 
     } 

     internal class TestClassOne : ITestInterface 
     { 
      public int GetValue() 
      { 
       return 1; 
      } 
     } 

     internal class TestClassTwo : ITestInterface 
     { 
      public int GetValue() 
      { 
       return 2; 
      } 
     } 

     internal class ClassToResolve 
     { 
      public int Value { get; private set; } 

      public ClassToResolve([Dependency("ClassTwo")]ITestInterface testClass) 
      { 
       Value = testClass.GetValue(); 
      } 
     } 

     [TestMethod] 
     public void Resolve_NamedCtorDependencyRegisteredLast_InjectsCorrectInstance() 
     { 
      using (IUnityContainer container = new UnityContainer()) 
      { 
       container.RegisterType<ITestInterface, TestClassOne>("ClassOne"); 
       container.RegisterType<ITestInterface, TestClassTwo>("ClassTwo"); 
       container.RegisterType<ClassToResolve>(); 

       var resolvedClass = container.Resolve<ClassToResolve>(); 

       Assert.AreEqual<int>(2, resolvedClass.Value); 
      } 
     } 

     [TestMethod] 
     public void Resolve_NamedCtorDependencyRegisteredFirst_InjectsCorrectInstance() 
     { 
      using (IUnityContainer container = new UnityContainer()) 
      { 
       container.RegisterType<ITestInterface, TestClassTwo>("ClassTwo"); 
       container.RegisterType<ITestInterface, TestClassOne>("ClassOne"); 
       container.RegisterType<ClassToResolve>(); 

       var resolvedClass = container.Resolve<ClassToResolve>(); 

       Assert.AreEqual<int>(2, resolvedClass.Value); 
      } 
     } 
    } 
0

相反,您可以嘗試在對象的構造函數中傳遞工廠。這樣你可以保證(和測試)代碼中的對象是什麼創建。