企业应用程序架构模式 - 整合业务数据

时间:2016-11-16 20:46:09

标签: c# architecture business-logic

为了让您快速了解我的应用程序架构,我的应用程序中包含以下层:

  • 域模型 - 为问题域和业务规则建模。
  • 服务模型 - 为应用程序使用的服务合同建模。
  • 数据访问层 - 域模型的持久性,在本例中使用EF。
  • 服务 - 服务模型的实现。
  • 网站 - MVC网络应用程序。
  • Web API - RESTful Web服务API。

现在的问题是Web API后来出现了; MVC Web应用程序是第一个构建在架构之上的东西。

我发现自己必须复制业务逻辑和ViewModels(MVC)和消息(Web API)......根据DRY原则,我不应该这样做,所以自然的解决方案是将业务逻辑推入它自己的层,独立于应用层。

但是......这意味着业务逻辑层需要它自己的一组模型,它们位于应用层和业务逻辑层之间。在这方面,它不适用于使用域模型,因为它们实际上不应该到达应用层。

简而言之,我正在寻找业界公认的业务逻辑建模标准。是否有一个公认的标准应该如何工作,如果是,那么什么类型的模型(即它不是域模型,它不是视图模型)属于业务逻辑层?

1 个答案:

答案 0 :(得分:1)

你偶然发现了一个有争议的讨论点。我自己一直在努力解决这个问题。

对象偏执者会争辩说你甚至不应该有服务层。然后可以直接使用您的域模型,这将消除逻辑重复。当然,那些是软件建模的美好时光。随着网络,apis和SOA的出现,我们不得不寻找替代方法来建模我们的软件。输入 Anemic Domain models

贫血领域模型基本上由轻量级对象组成,它们比任何东西都更像DTO,并且底层服务可以解决繁重的问题。

您在上面描述的架构似乎是混合设计。我猜你现在必须遇到将EF类映射到域对象的问题,这会创建另一层对象,除非你使用POCO,在这种情况下你会遇到命名空间问题而不是。

无论如何,我认为没有行业标准。我可以告诉你的是,我已经看到了一些模式出现在这里和那里倾向于贫血领域模型,并不难看出原因。在断开连接的环境(例如Web,API)中,复杂对象不能很好地工作,因此服务的富裕。

由于您已经很好地分层应用程序并且不希望暴露域模型对象,因此我建议您在服务实现中使用Anemic Models。这些本质上可以作为DTO对象,如果需要可以重用和序列化,但也可以实现甚至可以映射回服务中实现的功能的基本逻辑。

最后说明,没有一个适合所有人的规模。使用正确的工具完成工作。模式应该是指导原则,而不是逐步说明,因此请确保您可以随意调整它们以满足您的特定需求,同时保留一般的想法。

您可以在此处阅读有关贫血领域模型的更多信息: https://en.wikipedia.org/wiki/Anemic_domain_model

请务必查看Martin Fowler对Anemic Domain Models的反对意见: http://www.martinfowler.com/bliki/AnemicDomainModel.html