6

我处于必须从头开始设计和实施系统的情况。我有一些关于架构的问题,希望得到您的评论和想法。

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

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

要求:

  1. 丰富的用户界面和强大的
  2. 多设备支持(每个浏览器和每个设备上)
  3. 松耦合

下面是我构建的架构图:

在此处输入图像描述

架构简介

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

我的担忧:

  1. 由于应用程序将被构建为松散耦合,因此如果未来业务需求增长,新模块可以轻松插入而不会影响架构。所以我想到了将存储库模式与 IoC 和 DI 一起使用(可以是 Unity/Ninject/Sprint.NET 或任何其他)
  2. 支持 XML 和 JSON 的 WCF
  3. 用于放置 IoC 和 DI 的分布式服务层
  4. 使用 Enterprise Library 5.0 进行异常处理和记录

寻找有价值的意见和建议。如果我做错了什么,请让我朝着正确的方向前进。

4

4 回答 4

6

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

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

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

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

可能值得考虑的事项:将主模块和模块 2 构建为独立的垂直服务堆栈。

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

每个服务都有自己的数据库、自己的业务层、自己的服务层和自己的 UI 组件。

然而,这引起了人们的关注:Main Service 和 Service 2 如何协同工作来创建我的产品?

为了解决这个问题:

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

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

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

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

在我看来,这是一种与您建议的方法非常不同的方法,但可以让您更好地满足松散耦合的要求。

于 2012-01-18T09:38:19.933 回答
1

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

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

显然,这只有在您不在 WCF 层中放置任何逻辑时才有效。WCF 层实际上不应该有任何逻辑。

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

于 2012-01-18T09:24:40.907 回答
1

为什么架构图不使用 ASP.NET 的域层?

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

于 2012-01-18T09:29:45.513 回答
0

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

  • 领域模型在哪里?域核心还是持久层中的“模型”?
  • 领域层如何与数据访问层交互?交互不像服务/应用层和领域层之间那么清晰。
  • 领域层的存储库和数据访问层的存储库有什么区别?我通常区分在域层中具有作用于域模型对象的“模型存储库”和作用于 DTO 的数据访问层中的“数据网关”。
  • 什么是域核心?这是应用层事务的实现吗?
  • 是否需要进一步抽象持久化框架?(英孚)
于 2012-01-18T09:41:16.487 回答