我正在使用StructureMap.MVC5并拥有以下项目和类:
Web
HomeController(PageService pageService)
Services
PageService(IPageRepository pageRepository)
Repositories
PageRepository : IPageRepository
IRepositories
IPageRepository
使用StructureMap.MVC5的默认实现,它会自动将PageService解析为我的HomeController,而不是将PageRepository解析为我的PageService。这给了我例外:No parameterless constructor defined for this object.
通过在DefaultRegistry中添加一行来解决这个问题:
For<IPageRepository>().Use<PageRepository>();
但显然我宁愿让StructureMap自动解决这个问题。有没有办法实现这个目标?
这就是DefaultRegistry的样子:
public DefaultRegistry()
{
Scan(scan =>
{
scan.TheCallingAssembly();
scan.WithDefaultConventions();
scan.With(new ControllerConvention());
});
}
答案 0 :(得分:1)
您的存储库未自动解析的原因是因为它位于另一个程序集中,您的控制器中正在引用您的服务,这意味着它可以通过TheCallingAssembly
调用解决。
要告诉StructureMap加载您的存储库,您必须明确告诉它要扫描哪个程序集:
scan.AssemblyContainingType<IPageRepository>();
指定的类型不必是IPageRepository
类型,只是存储库程序集中的某种类型,因此StructureMap知道要查找的位置。
现在应该自动解决存储库程序集中的任何类型。