Istnieje wiele sposobów, aby osiągnąć pożądane wyniki (o czym świadczy wielu odpowiedzi). Oto inny sposób za pomocą nazwanych rejestracje (bez atrybutów):
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>();
Wadą tego podejścia jest to, że jeśli Przykład konstruktor zostanie zmieniona następnie kod rejestracyjny musi także zostać zmodyfikowane, aby dopasować. Ponadto błąd byłby błędem środowiska wykonawczego, a nie bardziej korzystnym błędem czasu kompilacji.
Można połączyć powyższe z InjectionFactory powołania konstruktora ręcznie dać kompilacji kontroli czasu:
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>();
Jeśli używasz korzeń skład następnie korzystanie z magicznych ciągów („ReceiveQueue” i " SendQueue ") byłby ograniczony do jednej lokalizacji rejestracji.
Chociaż to odpowiada na pytanie, nie jest to bardzo dobre rozwiązanie, ponieważ powoduje to zaśmiecanie aplikacji atrybutami i powiązanie aplikacji z kontenerem Unity. Zamiast tego wolałbym użyć 'InjectionFactory'. – Steven
Przykro mi, ale twój drugi (zaktualizowany) przykład jest złym pomysłem, dlatego otrzymujesz moje poparcie. Nie należy promować wstrzykiwania pojemnika na lekcje, to jest [zła praktyka] (http://blog.ploeh.dk/2010/02/03/ServiceLocatorisanAnti-Pattern/). – Steven
@Steven masz rację, odbieram tę zmianę. połączony artykuł ma kilka bardzo ważnych punktów. –