2017-01-16 2 views
1

Gegeben:Resolving Factory-Methoden für mehrere Implementierungen mit Autofac

public class InfoA { /* impl */ } 
public class InfoB { /* impl */ } 

public class ViewModelBase {} 
public class ViewModelA : ViewModelBase 
{ 
    public ViewModelA(InfoA info, Dep1 dep1, Dep2, dep2) { } 
} 

public class ViewModelB : ViewModelBase 
{ 
    public ViewModelB(InfoB info, Dep3 dep3, Dep4 dep4) { } 
} 

Wie kann ich Typen meinen Container registrieren, so dass ich

class ViewModelRepository 
{ 
    public ViewModelRepository(
     Func<InfoA, ViewModelA> factA, 
     Func<InfoA, ViewModelB> factB) { } 
} 

oder abwechselnd Func<InfoA, ViewModelBase> und Func<InfoB, ViewModelBase>

tun kann?

Zur Zeit habe ich

builder.RegisterType<ViewModelA>().As<ViewModelBase>() 
builder.RegisterType<ViewModelB>().As<ViewModelBase>(); 

, die nur für den Typ zuletzt registriert scheint zu funktionieren.

Antwort

0

Sie können nur Typen auflösen, die Sie tatsächlich im Container registriert haben. Wenn Sie die Methode .As<TService> verwenden, können Sie Abhängigkeiten nur nach TService auflösen.

So Func<InfoA, ViewModelA> zu lösen Sie ViewModelA die folgende Art und Weise registrieren:

builder.RegisterType<ViewModelA>(); 

wenn Sie es wollen von ViewModelA,

oder

builder.RegisterType<ViewModelA>().As<ViewModelBase>().AsSelf(); 

nur lösen, wenn Sie wollen lösen Sie es durch ViewModelA oder ViewModelBase, obwohl, wie Sie bereits erwähnten, es nicht möglich wäre, ge t ViewModelA direkt durch Auflösen ViewModelBase, weil die Standardimplementierung ist der zuletzt registrierte Typ (ViewModelB in Ihrem Fall), aber Sie können immer noch alle Arten von ViewModelBase mit Sammlung (z. B. IList<ViewModelBase>). ViewModelB sollte auf die gleiche Weise registriert werden.

IMHO, sollten Sie einige Schnittstellen in Ihrem Code einführen, da das Auflösen von Abhängigkeiten nach tatsächlichen Typen nicht genau so ist, wie Sie die Abhängigkeitsinjektion durchführen sollten. Klassen sollten eher von Verträgen (Schnittstellen) als von tatsächlichen Typen abhängen, so dass sie leicht ersetzt werden könnten, z. durch Mocks in Unit Tests.

Verwandte Themen