2011-01-23 59 views
1

我有具有三层 1.数据访问层(类库) 2.业务层(类库) 3.网层(asp.net MVC项目)structureMap在多层应用程序

一个asp.net MVC应用程序

,也有一个域项目(类库POCO)

我做我的MVC项目的Application_Start的structureMap映射,但在dataAccesslayer该类型的地图(对于如。personRepository与IPersonReository)我需要DAL在我的web层的参考,我不认为是正确的。

你有什么建议 感谢

回答

2

作为一个务实的态度,你在做什么可能是好的如果您可以保留该规则并且从不使用Web层的DAL。然而,一旦参考文献出现,这可能出乎意料地难以实现 - 那么项目中的其他开发人员又该如何呢?

更好的选择是,以分裂网层为两层

  1. 应用自举层。这是真正的Web项目,但除了引导容器和实现Views(.aspx页面)之外,应该没有别的。这就是我们所说的Humble Executable。它将包含对所有其他项目的引用(通过DI容器),但否则它不会执行任何操作。我们称之为Register Resolve Release pattern

  2. 应用模型层。该项目将包含您的所有应用程序逻辑(与域逻辑相反):查看模型和控制器。它不需要引用DAL,但会获得DI容器注入的实现。

0

没有什么错在具有Web项目的DAL的参考,只要你不直接进行到组装调用。但是,如果您对此方法感到不舒服,则可以在业务层中使用注册表,并为DAL注册类型。由于网络层无论如何都会需要有业务层中的参考,您可以使用从业务层注册表中的Web的应用程序启动

下面是一些示例代码

在BSNS层

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

,并在应用程序启动方法

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

如果假设有5个图层,该怎么办......尽管我们可以在每个图层中创建注册表,但是我们只能在application_start中初始化它们......所以我们无论如何都需要所有5个图层的引用...有没有解决这个问题... – 2011-01-23 06:06:34

+0

5层意味着5个项目。如果是这样的话,我会回去重新设计整个事情。项目越少越好。无论如何,你最初的问题,我会推荐@Seemann建议下面,有一个引导项目,将初始化与所有依赖关系DI容器 – Hakeem 2011-01-23 14:53:36

+0

是hakeem,我将与seeman的方法..感谢 – 2011-01-24 07:02:08

0

和其他人一样,对你的DAL项目的引用不是世界末日,除非你错误地使用它(或者可能在你的web项目中)。我更喜欢有一个基础设施项目包含与交叉关注相关的所有事情。除此之外,这包括我的日志记录和IoC容器。