带有MVC和多层的StructureMap

时间:2016-06-09 07:45:39

标签: asp.net .net asp.net-mvc dependency-injection structuremap

我正在使用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());
    });
}

1 个答案:

答案 0 :(得分:1)

您的存储库未自动解析的原因是因为它位于另一个程序集中,您的控制器中正在引用您的服务,这意味着它可以通过TheCallingAssembly调用解决。

要告诉StructureMap加载您的存储库,您必须明确告诉它要扫描哪个程序集:

scan.AssemblyContainingType<IPageRepository>();

指定的类型不必是IPageRepository类型,只是存储库程序集中的某种类型,因此StructureMap知道要查找的位置。

现在应该自动解决存储库程序集中的任何类型。