Asp.net mvc 多层应用程序中的structureMap

Asp.net mvc 多层应用程序中的structureMap,asp.net-mvc,dependency-injection,structuremap,Asp.net Mvc,Dependency Injection,Structuremap,我有一个asp.net mvc应用程序,它有三层 1.数据访问层(类库) 2.业务层(类库) 3.web层(asp.net mvc项目) 还有一个域项目(poco类库) 我正在MVC项目开始时的应用程序中进行structureMap映射,但要映射dataAccesslayer中的类型(例如带有IPersonReository的personRepository),我需要在web层中引用DAL,我认为这是不正确的 你有什么建议 谢谢只要您不直接调用该程序集,在web项目中引用DAL就没有错。但是,如

我有一个asp.net mvc应用程序,它有三层 1.数据访问层(类库) 2.业务层(类库) 3.web层(asp.net mvc项目)

还有一个域项目(poco类库)

我正在MVC项目开始时的应用程序中进行structureMap映射,但要映射dataAccesslayer中的类型(例如带有IPersonReository的personRepository),我需要在web层中引用DAL,我认为这是不正确的

你有什么建议
谢谢

只要您不直接调用该程序集,在web项目中引用DAL就没有错。但是,如果您对这种方法感到不舒服,您可以在业务层中使用注册表,并为DAL提供注册类型。因为Web层无论如何都需要有对业务层的引用,所以您可以在Web的AppStart中从业务层使用该注册表

下面是一些示例代码

Bsns层中的注册表类

public class BusinessRegistry:Registry
{
    public BusinessRegistry()
    {
         For<IDALInterface1>().Use<DALImpl1>();
    }
}

作为一种务实的方法,如果您能够遵守规则,并且从不从Web层使用DAL,那么您正在做的事情可能是可以的。然而,一旦有了参考资料,这就很难做到了——那么项目中的其他开发人员呢

更好的选择是将web层拆分为两层

  • 应用程序引导层。这是一个真正的web项目,但除了引导容器和实现视图(.aspx页面)之外,不应该有其他内容。这就是我们所说的“一个国家”。它将包含对所有其他项目的引用,以便(通过DI容器)组合它们,但在其他方面它什么都不做。我们称之为

  • 应用程序模型层。此项目将包含所有应用程序逻辑(与域逻辑相反):视图模型和控制器。它不需要对DAL进行引用,但将通过DI容器将实现注入其中


  • 正如其他人所说,对DAL项目的引用并不是世界末日,除非您使用不当(或者可能在web项目中)。我希望基础设施项目包含所有与交叉关注点相关的内容。其中包括我的日志记录和IoC容器。

    假设有5个层……虽然我们可以在每个层中创建注册表,但我们只能在应用程序启动时初始化它们……因此,我们无论如何都需要所有5个层的引用……是否有解决方案……5个层意味着5个项目。如果是这样的话,我会回去重新设计整件事。项目越少越好。不管怎样,对于您最初的问题,我推荐@Seemann在下面建议的,有一个引导项目,该项目将初始化DI容器,其中包含所有依赖项,非常感谢Mark…应用程序引导层将是一个asp.net mvc项目,而应用程序模型层将是一个类库项目?是的,应用程序模型层可以是一个类库项目,但由于控制器将在那里,它仍将引用相应的ASP.NET MVC程序集。感谢Justin的回答,但我认为首先不引用本身是安全的。我同意这就是为什么我的回答告诉您如何从Web上删除对Dal的引用
    var container = new Container(x => x.AddRegistry(new BusinessRegistry()));