multiTier应用程序中的structureMap

时间:2011-01-23 05:09:14

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

我有一个有三层的asp.net mvc应用程序 1. dataAccess层(类库) 2.业务层(类库) 3. web层(asp.net mvc项目)

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

我正在我的MVC项目的Application_start中进行structureMap映射,但是为了映射dataAccesslayer中的TYPES(例如,personRepository和IPersonReository)我需要在我的web层中引用DAL,我认为不正确

你有什么建议 感谢

3 个答案:

答案 0 :(得分:2)

作为一种务实的方法,你正在做的事情可能没问题如果你能保持纪律并且从不使用网络层中的DAL。但是,一旦有参考,这可能会非常难以做到 - 那么项目中的其他开发人员呢?

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

  1. 应用程序引导层。这是真正的Web项目,但除了引导容器和实现Views(.aspx页面)之外,别无其他。这就是我们所说的Humble Executable。它将包含对所有其他项目的引用以便组合它们(通过DI容器),但是否则它不会做任何事情。我们称之为Register Resolve Release pattern

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

答案 1 :(得分:0)

只要您没有直接调用该程序集,在Web项目中引用DAL就没有错。但是如果您对该方法感到不舒服,可以在Business层中使用Registry,并为DAL注册类型。由于Web层无论如何都需要引用Business层,因此您可以在Web的App start中使用Business层中的该注册表

以下是一些示例代码

Bsns图层中的注册表类

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

并在Application start方法中

var container = new Container(x => x.AddRegistry(new BusinessRegistry()));

答案 2 :(得分:0)

正如其他人所说,除非你错误地使用它(或者可能在你的网络项目中),否则对你的DAL项目的引用并不是世界末日。我更喜欢基础设施项目包含与跨领域问题相关的所有事项。除此之外,还包括我的Logging和IoC Container。