例如,假設我有一個接口'IFeed'和兩個實現此接口的具體類型('Feed1'和'Feed2')。現在讓我們假設我有一個'FeedManager'類型,它具有多個可以動態解析的參數,其中兩個類型是'IFeed',我希望通過構造函數注入來注入兩個具體類型,而不是通過手動解析(我只在組合根處使用解析一次)。我有一種感覺,我應該使用一個工廠,但我想看看這樣做的正確方法。提前謝謝了。注入(通過構造函數)實現相同接口的不同類型的正確方法是什麼?
-1
A
回答
0
如果你想要所有IFeed的實現,你可以在你的構造函數中使用數組語法,然後在類型註冊時不需要任何特殊的東西。
container.RegisterType<IFeedManager, FeedManager>();
container.RegisterType<IFeed, FeedA>("FeedA"); // The name doesn't matter
container.RegisterType<IFeed, FeedB>("FeedB"); // The name doesn't matter
那麼管理者構造...
public FeedManager(IFeed[] feeds) {...}
,或者如果你想添加一個小火炬調用直接構造...
public FeedManager(params IFeed[] feeds) {...}
0
假設您想要在運行時確定實際的具體實例,您需要使用命名類型註冊,然後告訴統一你想要哪一個。因此,使用工廠方法來構建所需的類型,並將其作爲參數覆蓋進行傳遞。 Unity將使用覆蓋並解決任何剩餘的依賴關係。
// register the types using named registrations
container.RegisterType<IFeedManager,FeedManager>()
container.RegisterType<IFeed, Feed1>("Feed1")
container.RegisterType<IFeed, Feed2>("Feed2")
假設你的飼料經理具有下列命名的構造函數的參數
class FeedManager : IFeedManager
{
public FeedManager (IFeed Feed1, IFeed Feed2, string someOtherDependency)
{
}
}
,並建立自己的資訊經理:
static IFeedManager CreateFeedManager()
{
ParameterOverride feed1 = new ParameterOverride("Feed1"
,_container.Resolve<IFeed>("feed1"));
ParameterOverride feed2 = new DependencyOverride("Feed2"
,_container.Resolve<IFeed>("feed2"));
IFeedManager = _container.Resolve<IFeedManager>(feed1,feed2)
return IFeedManager;
}
這顯然是過於簡單,但你插入自己的邏輯以確定哪個實例將被解析,然後針對FeedManager所需的每個IFeed實例注入。
0
使用Unity你可以這樣做,像這樣:
container.RegisterType<IFeed, Feed1>("Feed1");
container.RegisterType<IFeed, Feed2>("Feed2");
container.RegisterType<FeedManager>(new InjectionConstructor(new ResolvedParameter<IFeed>("Feed1"),
new ResolvedParameter<IFeed>("Feed2")));
現在這已配置統一,這樣,當它需要解決FeedManager
,這將解決FEED1爲第二個參數的第一個參數和Feed2。
相關問題
- 1. 什麼是定義類構造函數的正確方法?
- 2. 什麼是文件,類和構造函數的正確方法?
- 3. 實現類中的接口構造函數和方法
- 4. 在android,application context中實現構造函數的正確方法是什麼?
- 5. javascript:相同類型的對象的不同構造函數
- 6. Autofac註冊相同的接口,不同的構造
- 7. 使用StructureMap將相同接口的不同實現注入控制器的最佳方式是什麼?
- 8. 如何註冊實現相同接口的多種類型
- 9. 如何以不同的方式實現相同接口的通用方法?
- 10. 通過不同的JVM接口實現
- 11. 使用Ninject注入實現相同接口的不同類使用Ninject
- 12. 實現相同接口的接口內的內部類,我們通過這個實現了什麼?
- 13. 實現java Collection接口的正確方法是什麼
- 14. 爲什麼實現接口的類不是與Java中的接口相同的類型?
- 15. 注入多個相同類型的構造函數的參數與Ninject 2.0
- 16. 爲什麼C++構造函數接受不正確的類型作爲參數?
- 17. 如何註冊並使用相同接口的不同實現?
- 18. 在Windsor Container中註冊幾個相同類型的實例的正確方法是什麼?
- 19. 通過反射獲取接口類型的構造函數,是否有比遍歷類型更好的方法?
- 20. 什麼類型的java構造函數是這些?構造函數鏈接?
- 21. 無法實現具有不同類型參數的接口
- 22. Unity:通過其構造函數依賴解決接口實現
- 23. 什麼是類型和什麼是類型構造函數scala
- 24. 類實現兩個接口定義相同的方法
- 25. Java類中實現相同方法簽名的兩個接口
- 26. 在Scala中調用超類構造函數的正確方法是什麼?
- 27. 什麼類型是構造函數?
- 28. Castle Windsor:註冊具有相同構造函數參數的接口的所有實現
- 29. 通過調用構造函數(方法)類的明確
- 30. 通過構造函數傳遞什麼以及通過接口傳遞什麼?
通過自動DI工具通常做如Unity DI容器。您使用別名/名稱解析該類型,並在config或其他位置指定該參數。 – Haney 2014-12-05 02:29:53
當我嘗試使用別名時,我撞到了牆上,因爲它似乎需要指定確切的構造函數簽名;我似乎無法告訴它,一個名爲'feed1'的參數應該被解析爲這個,並且參數'feed2'應該被解析爲...我必須填寫所有參數。無論如何,我想知道這是否是適當的設計。 – Anthony 2014-12-05 02:33:45
您的問題與您接受的答案不符。也許代碼示例將在未來有所幫助。 – Lukazoid 2014-12-07 17:48:56