Ci sono molti modi per raggiungere i risultati desiderati (come evidenziato dalle risposte multiple). Ecco un altro modo con le registrazioni di nome (senza attributi):
IUnityContainer container = new UnityContainer();
container.RegisterType<IQueue, MessageQueue>("ReceiveQueue",
new InjectionConstructor("receivePath"));
container.RegisterType<IQueue, MessageQueue>("SendQueue",
new InjectionConstructor("sendPath"));
container.RegisterType<Example>(
new InjectionConstructor(
new ResolvedParameter<IQueue>("ReceiveQueue"),
new ResolvedParameter<IQueue>("SendQueue")));
Example example = container.Resolve<Example>();
Lo svantaggio di questo approccio è che se il costruttore Esempio è cambiato quindi il codice di registrazione deve essere modificato per corrispondere. Inoltre, l'errore sarebbe un errore di runtime e non un errore di compilazione più preferibile.
È possibile combinare quanto sopra con un'InjectionFactory per invocare il costruttore manualmente per dare tempo di compilazione controllo:
IUnityContainer container = new UnityContainer();
container.RegisterType<IQueue, MessageQueue>("ReceiveQueue",
new InjectionConstructor("receivePath"));
container.RegisterType<IQueue, MessageQueue>("SendQueue",
new InjectionConstructor("sendPath"));
container.RegisterType<Example>(new InjectionFactory(c =>
new Example(c.Resolve<IQueue>("ReceiveQueue"),
c.Resolve<IQueue>("SendQueue"))));
Example example = container.Resolve<Example>();
Se si utilizza una radice composizione allora l'uso delle corde magiche ("ReceiveQueue" e " SendQueue ") sarebbe limitato all'unica posizione di registrazione.
fonte
2013-08-27 17:02:44
Anche se questo risponde alla domanda, non è una soluzione molto buona, perché questo ingombra l'applicazione con gli attributi e accoppia l'applicazione al contenitore Unity. Preferirei usare invece un 'InjectionFactory'. – Steven
Mi dispiace, ma il tuo secondo esempio (aggiornato) è una cattiva idea, ecco perché ottieni il mio downvote. Non dovresti promuovere l'iniezione del contenitore in classi, cioè [cattiva pratica] (http://blog.ploeh.dk/2010/02/03/ServiceLocatorisanAnti-Pattern/). – Steven
@Steven hai ragione, riprendo quella modifica. l'articolo collegato ha alcuni punti molto validi. –