大约一年前,我建立了一个由 ASP.Net MVC 3(现在)表示层、应用程序层、域层和基础设施层(横切材料和数据)组成的解决方案。我决定将域模型与域逻辑保持在一个单独的项目中,并通过传递域实体而不是 DTO 对表示层使用一种轻松的方法,因为我们现在实际上只有一个前端。
除了我们的主网站之外,我们将很快为分布式层提供服务,我将在那里使用 DTO,但我也在考虑在主网站中使用 DTO。我还想知道我是否应该费心在域层(IRepository、IUnitOfWork、实体/值对象超类型等)中分解框架代码。那么在这里,让我列出我需要反馈的问题:
1) 我非常努力地避免没有贫血的领域模型,并且还注意特定于演示问题的行为。所需的大多数业务计算都在域实体上,表示层可以直接调用此行为还是应该调用应用程序服务,然后调用域实体?这向我表明,没有理由让表示层知道域实体,而是可以使用 DTO。或者,我可以让 DTO 公开这些行为,但是我觉得我在抢劫域实体。所以我猜这是最好的 3 个选项(直接调用丰富的域对象、服务层或具有行为的 dto)?
2)现在我有一个领域项目,它具有领域服务、规范和逻辑,由应用层和单独的领域模型项目(由表示层和应用层使用)编排。我这里还有通用存储库和工作单元模式的框架接口。我是否应该将框架内容分解为一个单独的项目并将其余部分合并为一个项目?
3)我想将我的领域层重组为聚合,现在所有的领域模型都是由模块组织的,基本上每个模块的所有类型都在一个命名空间中。通过聚合来组织实体、价值对象、服务和其他东西会更好吗?
4) 对于基本上是 .net 框架助手库类型的基础设施服务,我应该使用分离接口模式吗?例如配置对象或验证运行器?这样做有什么好处?
5) 最后,我所见过的使用域实体接口的例子并不多。由于依赖的原因,我几乎所有的对象都喜欢传递接口,它使测试变得更加容易。使用接口而不是混凝土是否有效?我应该提到我们使用 EF 4.3.1(即将升级到最新版本),我似乎记得 EF 在使用接口或其他东西时遇到了问题。我应该公开接口而不是域实体吗?
非常感谢您提前。
项目结构:
Presentation.Web | | | 应用 | | | Domain.Model - 域 (基础设施.数据、基础设施.核心、基础设施.安全)
说明:Presentation.Web(MVC3 Web 项目)
应用程序——编排领域层并响应来自表示层的请求的服务层(获取此更新)。这是按模块组织的,例如,如果我有一个客户模块,我将拥有 Application.Customer,其中包含所有应用程序服务
域——包含域服务、规范、计算和其他不作为域实体行为公开的域逻辑。例如,涉及多个域实体的计算,这些实体公开为应用层调用的域服务。-- 还包含规范框架的框架代码和通用存储库和工作单元模式的主要接口。
Domain.Model -- 包含域实体和枚举。按模块组织。例如,如果我可能有一个客户模块,它有一个客户实体、客户订单实体等。这是从域项目中分离出来的,以便应用程序和表示层可以使用这些对象。
Infrastructure.Security -- 用于身份验证和授权的安全基础设施
Infrastructure.Core - 由多个层(验证器、日志记录、配置、扩展、IoC、电子邮件等)使用的横切内容。大多数项目依赖于该项目中的接口(除了domain.model)来提供基础设施服务。
Infrastructure.Data——通过 LINQ 和 EF 4.3.1 的存储库实现、映射层、工作单元实现。接口在域项目中(分离接口模式)