假设:
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 :(得分:0)
您只能解析实际在容器中注册的类型。当您使用.As<TService>
方法时,它允许您仅通过TService
解析依赖关系。
要解决Func<InfoA, ViewModelA>
,您必须按以下方式注册ViewModelA
:
builder.RegisterType<ViewModelA>();
如果您只想通过ViewModelA
,
或
builder.RegisterType<ViewModelA>().As<ViewModelBase>().AsSelf();
如果您想通过ViewModelA
或ViewModelBase
解决问题,但正如您已经提到的那样,通过解析ViewModelA
无法直接获取ViewModelBase
,因为默认实现是最后注册的类型(在您的情况下为ViewModelB
),但您仍然可以使用集合解析所有类型的ViewModelBase
(例如IList<ViewModelBase>
)。 ViewModelB
应该以相同的方式注册。