例如,假設我有一個接口'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. 什麼是文件,類和構造函數的正確方法?
- 5. 將多個接口實現注入類構造函數
- 6. 爲什麼實現接口的泛型類不需要構造函數?
- 7. Ninject通過構造函數參數typeof類實現接口
- 8. 實現類中的接口構造函數和方法
- 9. 在android,application context中實現構造函數的正確方法是什麼?
- 10. javascript:相同類型的對象的不同構造函數
- 11. Autofac註冊相同的接口,不同的構造
- 12. 使用StructureMap將相同接口的不同實現注入控制器的最佳方式是什麼?
- 13. StructureMap:混凝土類構造函數接受相同的接口類型
- 14. 通過構造仿函數無法實現的雙函數是什麼?
- 15. 如何在不同的類中共享相同的構造函數,即在接口中定義構造函數?
- 16. 如何註冊實現相同接口的多種類型
- 17. 如何以不同的方式實現相同接口的通用方法?
- 18. 實現與不同類型的接口
- 19. 通過不同的JVM接口實現
- 20. 實現java Collection接口的正確方法是什麼
- 21. 實現相同接口的接口內的內部類,我們通過這個實現了什麼?
- 22. 使用Ninject注入實現相同接口的不同類使用Ninject
- 23. 爲什麼實現接口的類不是與Java中的接口相同的類型?
- 24. 注入多個相同類型的構造函數的參數與Ninject 2.0
- 25. 什麼是原型?構造函數或不同的對象?
- 26. 爲什麼C++構造函數接受不正確的類型作爲參數?
- 27. 什麼是爲值類型實現operator ++的正確方法?
- 28. 如何註冊並使用相同接口的不同實現?
- 29. 在Windsor Container中註冊幾個相同類型的實例的正確方法是什麼?
- 30. 什麼類型的java構造函數是這些?構造函數鏈接?
通過自動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