N层架构

时间:2012-01-18 09:04:27

标签: wcf entity-framework inversion-of-control n-layer

我遇到的情况是我必须从头开始设计和实施一个系统。我对架构有一些疑问,我希望你的评论和想法。

项目快速信息:这是一个以数据为中心的Web应用程序。

该应用程序将在带有MS SQL SERVER 2008数据库的Microsoft .NET Framework 4.0上构建。

要求:

  1. 丰富的用户界面和强大的
  2. 多设备支持(每个浏览器和每个设备)
  3. 松散耦合
  4. 以下是我构建的架构图:

    enter image description here

    架构简报

    1. 表示层:HTML5 / ASP.NET MVC + JQuery(第一版中支持多设备的Web应用程序)
    2. 分布式服务:WCF(XML / JSON / JSONP)
    3. 域层(业务层):所有业务逻辑
    4. 数据持久性(DAL层):具有数据库第一种方法的Entity Framework 4.0。使用T4模板
    5. 生成并分离出POCO实体
    6. 基础架构层:包含常见的库,如POCO实体,异常处理,日志记录等
    7. 我的担忧:

      1. 由于应用程序要构建松散耦合所以将来如果业务需求增长,可以轻松插入新模块而不影响架构。 所以我想到使用Repository模式以及IoC和DI(可以是Unity / Ninject / Sprint.NET或任何其他)
      2. 支持XML和JSON的WCF
      3. 分布式服务层放置IoC& DI
      4. 异常处理&使用Enterprise Library 5.0进行日志记录
      5. 寻找有价值的意见和建议。 如果我做错了什么,请把我指向正确的方向。

4 个答案:

答案 0 :(得分:6)

我建议以下评论:从一开始你的方法就会产生紧密耦合。这直接违背了你的要求#3“松散耦合”

在图表中,您定义了两个模块。主模块和模块2.我猜这两个模块彼此完全不同。我的意思是你可以完全单独开发它们然后插入它们,因为它们解决的业务问题是不同的。

但是,您当前的架构方法:

  • 将主模块和模块2数据耦合到同一数据库中
  • 将主模块和模块2业务对象耦合到同一业务层
  • 将主模块和模块2服务耦合到同一服务层
  • 结合主模块和模块2的部署和管理

值得考虑的是:将主模块和模块2构建为单独的垂直服务堆栈。

我的意思是主模块和模块2成为主要服务服务2

每个服务都有自己的数据库,它自己的业务层,它自己的服务层以及它自己的UI组件。

然而,这引起了关注:主服务和服务2如何协同工作来创建我的产品?

解决这个问题:

  1. 在UI端,您可以使用客户端代码将前端拼接在一起,以将主服务和服务2的响应加载到一个视图中。

  2. 在后端,您使用发布订阅消息传递,以允许主服务订阅服务2中发生的事件,反之亦然。

  3. 这将导致应用程序在松散耦合的垂直服务堆栈之上构建一个应用程序,通过异步交换消息来保持一致性。

    如果您需要在应用程序中添加一个新模块,您可以创建一个支持所需功能的新服务堆栈,并在不需要对其他堆栈进行任何更改的情况下进行连接(理想情况下,这是唯一的原因)更改现有堆​​栈将是他们想要订阅来自新模块的事件)。

    这是一种与你所建议的方法截然不同的方法,但是在我的意见中,这种方法可以让你更好地满足松散耦合的要求。

答案 1 :(得分:1)

WPF,WinForm等UI应该调用WCF层是有道理的。我假设拥有多个UI是一项业务需求,否则如果您只能拥有一个UI,则响应式Web UI是最灵活的选择。

但是,我不认为您的MVC UI需要使用WCF层。它可以直接调用域层。那会更快,并删除一个无意义的层。

显然,只要您不在WCF层中放置任何逻辑,这只会起作用。而且WCF层实际上不应该有任何逻辑。

您还声明要放置IoC&分布式服务层中的DI。就MVC UI而言,这没有多大意义。您需要在MVC项目中使用DI,以便对控制器进行单元测试。

答案 2 :(得分:1)

为什么体系结构图不使用ASP.NET的域层?

在我看来,您可能正在构建您的应用程序。此外,虽然支持6种(或左右)不同的前端技术看起来很棒,但维护所有这些技术的努力将是可怕的。我坚持使用一种技术作为前端 - 最有可能是客户端MVC或类似的HTML5。

答案 3 :(得分:0)

看看你的图表,我有几点我不清楚:

  • 域名模型在哪里?域核心还是持久层中的“模型”?
  • 域层如何与数据访问层交互?交互不像服务/应用程序层和域层之间那样清晰。
  • 域层中的存储库与数据访问层中的存储库之间有什么区别?我通常区分在域层中有“模型存储库”作用于域模型对象,而数据访问层中的“数据网关”作用于DTO。
  • 什么是域核心?这是应用层事务的实现吗?
  • 是否需要进一步抽象持久性框架? (EF)