Asp.net mvc 域模型与服务层中的ASP.NET MVC业务逻辑

Asp.net mvc 域模型与服务层中的ASP.NET MVC业务逻辑,asp.net-mvc,business-logic,service-layer,domain-model,anemic-domain-model,Asp.net Mvc,Business Logic,Service Layer,Domain Model,Anemic Domain Model,我已经读了一段时间关于在ASP.NETMVC项目中把业务逻辑放在哪里的书,但我仍然不能弄清楚一些事情 1-域模型。这些到底是什么?在我的模型文件夹中,我只有一堆与我的数据库相对应的类。我先用EF代码。我假设这些是我的领域模型 2-服务层。建议使用服务层,我认为这非常有意义。我决定用这个。然而,这篇文章把我的头脑搞乱了 我真的不确定如何向域模型添加逻辑 我已经讨论了许多与业务逻辑相关的问题,每个问题都提出了1或2。我不明白的是如何实现第一个。向实体类(我的域模型)添加方法毫无意义。为什么第二种方法

我已经读了一段时间关于在ASP.NETMVC项目中把业务逻辑放在哪里的书,但我仍然不能弄清楚一些事情

1-域模型。这些到底是什么?在我的模型文件夹中,我只有一堆与我的数据库相对应的类。我先用EF代码。我假设这些是我的领域模型

2-服务层。建议使用服务层,我认为这非常有意义。我决定用这个。然而,这篇文章把我的头脑搞乱了

我真的不确定如何向域模型添加逻辑


我已经讨论了许多与业务逻辑相关的问题,每个问题都提出了1或2。我不明白的是如何实现第一个。向实体类(我的域模型)添加方法毫无意义。为什么第二种方法被认为是不好的?

我更喜欢在域模型中没有业务逻辑。我通常将域模型作为POCO来表示我的DB表/模式

保持业务逻辑远离域模型将允许我在另一个项目中重用我的域模型


您可以考虑控制器和数据访问层/存储层之间的中间层来处理这一点。我将其称为服务层。

首先,Asp.Net MVC项目中的模型文件夹应用于ViewModels。这些是控制器发送到视图的模型。它们应该针对视图进行高度优化,这意味着只有视图所需的属性,而没有其他属性

您所了解的领域模型与业务模型相同,属于您的业务层。Asp.NETMVC项目中的模型文件夹是UI层的模型

第二种方法是,您的服务(真正的业务)层中的业务逻辑并不坏。它是数据层和UI层(3层体系结构)之间非常好的缓冲区。数据层负责从web服务或数据库获取数据,业务/服务层负责将数据转换为业务/域模型。它还包含任何业务逻辑,如计算等

这些业务/领域模型通常是POCO,但它们不一定是POCO。这就是我有时建立商业模式的方式:

public class BusinessObject
{
    private DataObject _dataObject;

    public BusinessObject(DataObject dataObject)
    {
        _dataObject = dataObject;
    }

    public int BusinessId
    {
        get {return _dataObject.Id;}
        set {_dataObject.Id = value;}
    }

    public string Name
    {
        get {return _dataObject.Description;}
        set {_dataObject.Description = value;}
    }
}

我知道这已经得到了回答,但我将模型分为3组

ViewModels-这些是轻量级(通常是poco)类,用于对站点页面所需的数据进行建模。这些类处理向用户显示的内容的普通样板文件,并在要显示的数据发生更改时进行更改

DomainModels——这些通常是重量级的业务逻辑类。他们通常为你正在做的事情建模核心业务规则。这些类通常具有高度的内聚性,并且是使您的站点变得特别的大部分工作发生的地方。我说过这些模型通常都是重量级的,但实际上,如果您的项目只是从用户那里获取数据并将其粘贴到数据库中,那么这个类将是一个小型的数据映射类。很多时候,您会看到这些类由持久性模型和返回的视图模型组成

PersistenceModels——这些是持久性机制的模型。对我们大多数人来说,这意味着对数据库表进行建模,但也可能是复杂的nosql文档或从api请求返回的json(或其他)数据。他们的职责是处理外部数据的形状


还请记住,您并不总是需要在项目中提供所有这三种类型的模型。有时,您的视图模型将是一行接一行的持久化模型。在这种情况下,您将浪费您的客户的钱来编写两次整个内容,并添加一个域模型来将一个映射到另一个。你是开发人员,你的工作是知道何时建造一艘航空母舰去商店购买杂货。

应用程序流控制逻辑属于控制器

数据访问逻辑属于存储库

验证逻辑属于服务层

服务层是ASP.NET MVC应用程序中的一个附加层,用于调解控制器和存储库层之间的通信

服务层包含业务验证逻辑

例如,产品服务层有一个CreateProduct()方法

CreateProduct()方法调用ValidateProduct()方法,在将产品传递到产品存储库之前验证新产品

资料来源:


域模型应该能够自己执行工作,并公开表示其状态和功能的属性和方法。它们充当模型运行所需的信息层次结构的根(聚合根)。它们保持隐藏状态,仅对服务可用

服务通过从封装数据访问层的存储库检索模型,将业务/域功能作为一组遵循消息模式(请求/响应)的API向外部世界(web服务、UI等)公开,然后对模型调用方法/业务函数,最后将它们保存回存储库

有时感觉服务重复了业务对象的方法,但在时间和实际实践中,实际情况并非如此

在真正的领域驱动设计中,您至少需要3组对象。业务对象、业务对象和服务的存储库

假设您的需求总是由不同的团队编写每种类型的组件。一个团队需要一个公开的服务,而不知道细节,另一个团队也不必自己编写服务的逻辑。然后,任何需要该服务的人都可以使用该服务,而无需深入研究核心模型