Ich würde dringend empfehlen gegen einen dedizierten/lokalen/injizierten UnityContainer für jeden Typ wie eines der vorgeschlagenen Poster zu erstellen.
Dies kann auf zwei Arten angegangen werden.
Eines wird durch das Definieren der Auflösung in Registrierungszeit als TylerOhlsen vorgeschlagen. obwohl Dies ist eine gute Lösung, wenn Sie später registrieren beide ARepository und BRepository als Implementierungen für IRepository, müssen Sie noch mit der Tatsache umgehen, müssen Sie zwei implenetations für die gleiche Schnittstelle, und wenn eine dritte Klasse eines Tages erfordern eine Implementierung IRepository, ohne es speziell in der Registrierung zu definieren, wird es eine unvorhersehbare Instanz erhalten.
Die zweite Option, die etwas sicherer ist, ist die Registrierung einer Fabrik für IRepository. Das einfachste Beispiel wäre eine Zeichenfolge als Schlüssel verwendet wird, wie folgt aus:
// Create a resolver(abstract factory) for the IRepository interface type
var resolver = myContainer.Resolve<Func<IRepository>>();
// ... other code here...
// Register mappings for the IRepository interface to appropriate concrete types
myContainer.RegisterType<IRepository, ARepository>("A");
myContainer.RegisterType<IRepository, BRepository>("B");
Dann bei der Umsetzung von FooController und BarController die func Fabrik durch Injektion erhalten und die richtige Instanz auswählen.
public class FooController
{
IRepository repository;
public FooController(IService service, Func<IRepository> repositoryFactory)
{
repository = repositoryFactory("A");
}
}
Sie können hier mehr über diese Zeilen lesen: http://msdn.microsoft.com/en-us/library/ff660854%28v=pandp.20%29.aspx
Die dup Frage sieht anders aus, aber die Antwort ist genau das gleiche. – jgauffin
Hier ist ein weiterer, wo die Antwort funktioniert: http://stackoverflow.com/questions/4989676/injecting-a-specific-instance-of-an-interface-using-autofac – jgauffin