2017-09-27 149 views
0

如果有兩個類Class1Class2,它們都實現接口IInterface在結構圖中使用與forSingletonOf一起使用

現在,如果我需要每個這些類的單例實例,這是否是實現它的正確方法?

c.ForSingletonOf<IInterface>().Use<Class1>().Named("Class1"); 
c.ForSingletonOf<IInterface>().Add<Class2>().Named("Class2"); 

,然後讓這樣的實例:

container.GetInstance<IInterface>("Class1"); 
container.GetInstance<IInterface>("Class2"); 

有什麼不對的這種做法還是有更好的方法?

回答

0

如果您想要訪問IInterface的特定實現,您將需要訪問容器以請求特定的命名實例。 構造函數注入將始終爲您提供Class1,因爲您已經告訴構造圖用於IInterface。所以這可能會導致你通過容器,這是一個非常糟糕的主意。

如果需要將對象創建爲單例,我建議不要注入爲IInterface,而是注入Class1和Class2。他們是您的申請中的一等公民,並有資格直接訪問。

c.ForSingletonOf<Class1>().Use<Class1>(); 
c.ForSingletonOf<Class2>().Use<Class2>(); 

根據您閱讀的博客,您可能需要指定Class1和Class2的實現作爲接口,歸因於它們提供的目的。這樣,如果IClass1或IClass2的支持單例應該改變,你將來可以證明它們。

public interface IClass1 : IInterface { } 
public interface IClass2 : IInterface { } 

----- 

c.ForSingletonOf<IClass1>().Use<Class1>(); 
c.ForSingletonOf<IClass2>().Use<Class2>(); 

這就是我將如何去做。我已經找到的容器中的命名實例僅在配置容器時有用,因爲我可以訪問它。當涉及到依賴注入時,它們不是有用的,因爲您需要的命名實例由類/接口名稱指定。如果您需要多個相同接口的實施,則他們有資格獲得他們自己的接口imo