2013-07-26 40 views
9

有沒有一種方法可以註冊一個接口,該接口由多個具體類使用[simple-injector]實現並且不使用模板接口?使用單一接口註冊多個實現

說,我們有2類MyClass1Myclass2和這兩個類都實現IInterface1

現在,使用[簡單的注射器]我們沒能做到這一點

container.Register<IInterface1, Myclass1>(); 
container.Register<IInterface1, Myclass2>(); 

將現有的界面模板界面在現有的代碼庫上有點辛苦。希望有一些更容易。

回答

12

您可以註冊多個實現使用的RegisterCollection方法相同的接口(見documentation:配置實例的集合返回到)

所以你需要寫:

container.RegisterCollection<IInterface1>(new[] { typeof(Myclass1), typeof(Myclass2) }); 

現在簡單的注射器可以將Interface1實現集合注入到您的構造函數中,例如:

public class Foo 
{ 
    public Foo(IEnumerable<IInterface1> interfaces) 
    { 
     //... 
    } 
} 

或者你可以明確地GetAllInstances解決您IInterface1實現:

var myClasses = container.GetAllInstances<IInterface1>(); 
+0

問題與SimpleInjector是,註冊多個實現了一個接口之後,就沒有辦法來指定註冊的情況下,應給定接口返回。在您的示例中,您無法指定在請求IInterface1時返回類Myclass2的實例。像Ninject這樣的其他IoC容器允許爲相同服務(接口)「註冊」每個註冊,以便您可以在解決時間以後消除歧義。 – Lester

+2

@Lester:如果你需要這個,確保你沒有違反[Liskov Substitution Principle](https://en.wikipedia.org/wiki/Liskov_substitution_principle)。但無論哪種方式,以下是關於在簡單注入器中使用[鍵入註冊]的更多信息(https://simpleinjector.readthedocs.org/en/latest/howto.html#resolve-instances-by-key)。 – Steven

+1

@nemesv如果我們一次需要一個實現,例如Shoper類的構造函數具有ICreditCard接口。 MasterCard和VisaCard兩個班級實施ICreditCard。 Shoper一次只需要一個課程。在這種情況下如何使用IOC? – 2017-02-03 10:35:03

相關問題