2013-07-26 14 views
9

C'è un modo per registrare una singola interfaccia che è implementata da più di una classe concreta usando [simple-injector] e senza usare l'interfaccia template?Registrazione di più implementazioni con singola interfaccia

dire che abbiamo 2 classi MyClass1 e Myclass2 ed entrambe queste classi stanno attuando IInterface1

Ora utilizzando [semplice-iniettore] non siamo stati in grado di fare questa interfaccia esistente

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

conversione all'interfaccia template è un po 'difficile sulla base di codice esistente. Sperando ci sia qualcosa di più facile là fuori.

risposta

12

È possibile registrare più attuazione della stessa interfaccia con l'utilizzo del metodo RegisterCollection (vedi documentation: configurazione di un insieme di istanze da restituire)

Quindi è necessario scrivere:

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

Ed ora semplice iniettore può iniettare una raccolta di Interface1 implementazione nel vostro costruttore, ad esempio:

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

Oppure si può risolvere in modo esplicito i tuoi IInterface1 implementazioni con GetAllInstances:

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

problema con SimpleInjector è, dopo la registrazione più implementazioni per una sola interfaccia, non c'è modo di specificare quale dei casi registrati dovrebbero essere restituiti per una data interfaccia. Nell'esempio, non è possibile specificare di restituire un'istanza di classe Myclass2 quando si richiede IInterface1. Altri contenitori IoC come Ninject consentono di "nominare" ciascuna registrazione per lo stesso servizio (interfaccia), in modo da poter disambiguare in un secondo momento al momento della risoluzione. – Lester

+2

@Lester: se ti serve, assicurati di non violare il [Principio di sostituzione di Liskov] (https://en.wikipedia.org/wiki/Liskov_substitution_principle) se ti serve. Ma in entrambi i casi, ecco ulteriori informazioni sull'uso di [Registrazione con chiave in Simple Injector] (https://simpleinjector.readthedocs.org/en/latest/howto.html#resolve-instances-by-key). – Steven

+1

@nemesv cosa succede se abbiamo bisogno di un'implementazione alla volta, ad es. Il costruttore della classe Shoper ha un'interfaccia ICreditCard. E 2 classi MasterCard e VisaCard implementano ICreditCard. Shoper ha bisogno di una lezione alla volta. Come utilizzare IOC in questo scenario? –

Problemi correlati