2014-12-05 78 views
-1

例如,假設我有一個接口'IFeed'和兩個實現此接口的具體類型('Feed1'和'Feed2')。現在讓我們假設我有一個'FeedManager'類型,它具有多個可以動態解析的參數,其中兩個類型是'IFeed',我希望通過構造函數注入來注入兩個具體類型,而不是通過手動解析(我只在組合根處使用解析一次)。我有一種感覺,我應該使用一個工廠,但我想看看這樣做的正確方法。提前謝謝了。注入(通過構造函數)實現相同接口的不同類型的正確方法是什麼?

+0

通過自動DI工具通常做如Unity DI容器。您使用別名/名稱解析該類型,並在config或其他位置指定該參數。 – Haney 2014-12-05 02:29:53

+0

當我嘗試使用別名時,我撞到了牆上,因爲它似乎需要指定確切的構造函數簽名;我似乎無法告訴它,一個名爲'feed1'的參數應該被解析爲這個,並且參數'feed2'應該被解析爲...我必須填寫所有參數。無論如何,我想知道這是否是適當的設計。 – Anthony 2014-12-05 02:33:45

+0

您的問題與您接受的答案不符。也許代碼示例將在未來有所幫助。 – Lukazoid 2014-12-07 17:48:56

回答

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。

相關問題