2017-01-16 63 views
1

多種實現解決工廠方法給定:與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) { } 
} 

如何註冊類型,以我的容器,這樣我可以做

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

或交替Func<InfoA, ViewModelBase>Func<InfoB, ViewModelBase>

目前我有

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

這似乎只爲最後登記的工作類型。

回答

0

您只能解析您在容器中實際註冊的類型。當您使用.As<TService>方法時,它只允許您通過TService來解決依賴關係。

因此,要解決Func<InfoA, ViewModelA>,你必須註冊ViewModelA方式如下:

builder.RegisterType<ViewModelA>(); 
如果你想只通過 ViewModelA解決它

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

,如果你想通過ViewModelAViewModelBase來解決它,但是,正如你已經提到的那樣,它不可能被ge t ViewModelA直接通過解析ViewModelBase,因爲默認實現是最後註冊的類型(在您的情況下爲ViewModelB),但仍然可以使用集合(例如,)來解析所有類型的ViewModelBaseIList<ViewModelBase>)。 ViewModelB應該以相同的方式註冊。恕我直言,你應該在你的代碼中引入一些接口,因爲通過實際類型解決依賴關係並不完全如何你應該做依賴注入。類應該依賴於契約(接口),而不是實際的類型,所以它們可以很容易地被替換,例如。在單元測試中嘲笑。