企业应用架构模式——整合业务数据
Patterns of Enterprise Application Architecture - consolidating business data
为了让您快速了解我的应用程序架构,我的应用程序中有以下层:
- 领域模型 - 对问题领域和业务规则建模。
- 服务模型 - 为应用程序使用的服务契约建模。
- 数据访问层 - 域模型的持久性,在本例中使用 EF。
- 服务 - 服务模型的实现。
- 网站 - MVC 网络应用程序。
- Web API - RESTful 网络服务 API.
现在的问题是网络API来得晚; MVC 网络应用程序是第一个构建在架构之上的东西。
我发现自己必须复制业务逻辑和 ViewModels (MVC) 和 Messages (Web API)...根据 DRY 原则,我不应该这样做,所以自然的解决方案是将业务逻辑推入独立于应用程序层的自己的层。
但是...这意味着业务逻辑层需要它自己的一组模型,这些模型位于应用程序层和业务逻辑层之间。在这方面,它不适用于使用域模型,因为它们真的不应该触及应用层。
简而言之,我正在寻找一个行业公认的业务逻辑建模标准。对于这应该如何工作,是否有公认的标准?如果是,哪种类型的模型(即它不是域模型,也不是视图模型)属于业务逻辑层?
您偶然发现了一个有争议的讨论点。我自己也为此苦苦挣扎了很长时间。
对象偏执狂会争辩说你甚至不应该有一个服务层。然后可以直接使用您的域模型,这将消除逻辑重复。诚然,那是软件建模的美好时光。随着网络、API 和 SOA 的出现,我们被迫寻找其他方式来建模我们的软件。输入 贫血域模型。
Anemic Domain 模型本质上由最类似于 DTO 的轻量级对象组成,底层服务承担繁重的工作。
您上面描述的体系结构似乎是一种混合设计。我猜你现在肯定已经 运行 解决了将 EF 类 映射到域对象的问题,这会创建另一层对象,除非你使用 POCO,在这种情况下你 运行命名空间问题等等。
无论如何,我认为没有行业标准。我可以告诉你的是,我已经看到这里和那里出现了一些倾向于贫血领域模型的模式,而且不难看出原因。在断开连接的环境中(例如网络,API),复杂的对象不能很好地工作,因此服务丰富。
由于您已经很好地对应用程序进行了分层并且不希望公开域模型对象,因此我建议在您的服务实现中使用贫血模型。这些本质上将用作 DTO 对象,如果需要可以重复使用和序列化,但也可以实现甚至可以映射回服务中实现的功能的基本逻辑。
最后一点,没有万能的。使用正确的工具来完成工作。模式旨在作为指南,而不是分步说明,因此请确保您可以随意调整它们以满足您的特定需求,同时保留总体思路。
您可以在此处阅读有关贫血领域模型的更多信息:
https://en.wikipedia.org/wiki/Anemic_domain_model
请务必查看 Martin Fowler 对贫血领域模型的反对意见:
http://www.martinfowler.com/bliki/AnemicDomainModel.html
为了让您快速了解我的应用程序架构,我的应用程序中有以下层:
- 领域模型 - 对问题领域和业务规则建模。
- 服务模型 - 为应用程序使用的服务契约建模。
- 数据访问层 - 域模型的持久性,在本例中使用 EF。
- 服务 - 服务模型的实现。
- 网站 - MVC 网络应用程序。
- Web API - RESTful 网络服务 API.
现在的问题是网络API来得晚; MVC 网络应用程序是第一个构建在架构之上的东西。
我发现自己必须复制业务逻辑和 ViewModels (MVC) 和 Messages (Web API)...根据 DRY 原则,我不应该这样做,所以自然的解决方案是将业务逻辑推入独立于应用程序层的自己的层。
但是...这意味着业务逻辑层需要它自己的一组模型,这些模型位于应用程序层和业务逻辑层之间。在这方面,它不适用于使用域模型,因为它们真的不应该触及应用层。
简而言之,我正在寻找一个行业公认的业务逻辑建模标准。对于这应该如何工作,是否有公认的标准?如果是,哪种类型的模型(即它不是域模型,也不是视图模型)属于业务逻辑层?
您偶然发现了一个有争议的讨论点。我自己也为此苦苦挣扎了很长时间。
对象偏执狂会争辩说你甚至不应该有一个服务层。然后可以直接使用您的域模型,这将消除逻辑重复。诚然,那是软件建模的美好时光。随着网络、API 和 SOA 的出现,我们被迫寻找其他方式来建模我们的软件。输入 贫血域模型。
Anemic Domain 模型本质上由最类似于 DTO 的轻量级对象组成,底层服务承担繁重的工作。
您上面描述的体系结构似乎是一种混合设计。我猜你现在肯定已经 运行 解决了将 EF 类 映射到域对象的问题,这会创建另一层对象,除非你使用 POCO,在这种情况下你 运行命名空间问题等等。
无论如何,我认为没有行业标准。我可以告诉你的是,我已经看到这里和那里出现了一些倾向于贫血领域模型的模式,而且不难看出原因。在断开连接的环境中(例如网络,API),复杂的对象不能很好地工作,因此服务丰富。
由于您已经很好地对应用程序进行了分层并且不希望公开域模型对象,因此我建议在您的服务实现中使用贫血模型。这些本质上将用作 DTO 对象,如果需要可以重复使用和序列化,但也可以实现甚至可以映射回服务中实现的功能的基本逻辑。
最后一点,没有万能的。使用正确的工具来完成工作。模式旨在作为指南,而不是分步说明,因此请确保您可以随意调整它们以满足您的特定需求,同时保留总体思路。
您可以在此处阅读有关贫血领域模型的更多信息: https://en.wikipedia.org/wiki/Anemic_domain_model
请务必查看 Martin Fowler 对贫血领域模型的反对意见: http://www.martinfowler.com/bliki/AnemicDomainModel.html