使用autofac

时间:2017-01-16 19:13:07

标签: c# 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>();

这似乎只适用于最后注册的类型。

1 个答案:

答案 0 :(得分:0)

您只能解析实际在容器中注册的类型。当您使用.As<TService>方法时,它允许您仅通过TService解析依赖关系。

要解决Func<InfoA, ViewModelA>,您必须按以下方式注册ViewModelA

builder.RegisterType<ViewModelA>();

如果您只想通过ViewModelA

解决此问题

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

如果您想通过ViewModelAViewModelBase解决问题,但正如您已经提到的那样,通过解析ViewModelA无法直接获取ViewModelBase,因为默认实现是最后注册的类型(在您的情况下为ViewModelB),但您仍然可以使用集合解析所有类型的ViewModelBase(例如IList<ViewModelBase>)。 ViewModelB应该以相同的方式注册。

恕我直言,您应该在代码中引入一些接口,因为按实际类型解析依赖关系并不是您应该如何进行依赖注入。类应该依赖于契约(接口)而不是实际类型,因此可以很容易地替换它们,例如,在单元测试中通过模拟。