Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 应该在DTO模型中还是在目标实体模型中执行计算?_C#_Entity Framework_Asp.net Core_Entity Framework Core_Dto - Fatal编程技术网

C# 应该在DTO模型中还是在目标实体模型中执行计算?

C# 应该在DTO模型中还是在目标实体模型中执行计算?,c#,entity-framework,asp.net-core,entity-framework-core,dto,C#,Entity Framework,Asp.net Core,Entity Framework Core,Dto,我目前正在ASP.NET Core 2.2中创建各种实体,并附带用于Web API的DTO。客户端应用程序将向相关控制器操作提交DTO对象。在那里,使用AutoMapper,这将从DTO对象映射到实体对象。生成的实体对象将保存到实体框架存储库中,此时该存储库将是一个Microsoft SQL数据库。为了简洁起见,我们假设时区在这种情况下是不相关的 我只是想知道哪种方法更合适,或者甚至在DTO或实体中都没有计算,但可能在控制器操作中 注意:实际的代码更复杂,涉及各种属性的各种计算,我只选择了一个简

我目前正在ASP.NET Core 2.2中创建各种实体,并附带用于Web API的DTO。客户端应用程序将向相关控制器操作提交DTO对象。在那里,使用AutoMapper,这将从DTO对象映射到实体对象。生成的实体对象将保存到实体框架存储库中,此时该存储库将是一个Microsoft SQL数据库。为了简洁起见,我们假设时区在这种情况下是不相关的

我只是想知道哪种方法更合适,或者甚至在DTO或实体中都没有计算,但可能在控制器操作中

注意:实际的代码更复杂,涉及各种属性的各种计算,我只选择了一个简单的例子来说明我的问题

方法#1

//实体
公共课活动时间
{
公共日期时间开始{get;set;}
公共日期时间结束{get;set;}
公共十进制TotalHours=>(十进制)(结束-开始).TotalHours;
}
//DTO
公共类EventTimesDto
{
公共日期时间开始{get;set;}
公共日期时间结束{get;set;}
}
方法#2

//实体
公共课活动时间
{
公共日期时间开始{get;set;}
公共日期时间结束{get;set;}
公共十进制总小时数{get;set;}
}
//DTO
公共类EventTimesDto
{
公共日期时间开始{get;set;}
公共日期时间结束{get;set;}
公共十进制TotalHours=>(十进制)(结束-开始).TotalHours;
}

它取决于实际的上下文。
EventTimes
是实体还是域模型的一部分

无论哪种方式,我都不会把它放在dto中,因为这实际上只是为了传输数据,所以它不应该包含任何逻辑(除了验证之外)

由于此计算的责任既不是dto的一部分,也不是实体模型的一部分,因此可以将繁重的计算放在
EventTimeCalculator
中,如下所示:

public class EventTimesCalculator
{
    public decimal CalculateTotalHours(EventTimes eventTimes)
    {
        return (decimal)(eventTimes.End - eventTimes.Start).TotalHours;
    }
}
如果
EventTimes
是业务层/域模型的一部分,则更合适的方法是在模型中使用
GetTotalHours()
方法,而不是属性。当然,如果要保存该信息,需要将其映射到持久性模型。再说一次,由于可以计算这些信息,所以根本不需要将其持久化,主要是因为逻辑可能会改变(例如:排除中断、中断等)

我的建议是不要再考虑数据库实体(我想你是指上面提到的)


最后,这是一个比较详细的计算逻辑,更重要的是要有一个直截了当的设计。应用程序是否将该逻辑放在包含业务逻辑的层中。如果是分布式体系结构,则在负责事件的服务中处理模型的计算。它是否只是一个小API,请保持简单,将其放在您或您的团队最期望的位置。

这取决于实际环境。
EventTimes
是实体还是域模型的一部分

无论哪种方式,我都不会把它放在dto中,因为这实际上只是为了传输数据,所以它不应该包含任何逻辑(除了验证之外)

由于此计算的责任既不是dto的一部分,也不是实体模型的一部分,因此可以将繁重的计算放在
EventTimeCalculator
中,如下所示:

public class EventTimesCalculator
{
    public decimal CalculateTotalHours(EventTimes eventTimes)
    {
        return (decimal)(eventTimes.End - eventTimes.Start).TotalHours;
    }
}
如果
EventTimes
是业务层/域模型的一部分,则更合适的方法是在模型中使用
GetTotalHours()
方法,而不是属性。当然,如果要保存该信息,需要将其映射到持久性模型。再说一次,由于可以计算这些信息,所以根本不需要将其持久化,主要是因为逻辑可能会改变(例如:排除中断、中断等)

我的建议是不要再考虑数据库实体(我想你是指上面提到的)


最后,这是一个比较详细的计算逻辑,更重要的是要有一个直截了当的设计。应用程序是否将该逻辑放在包含业务逻辑的层中。如果是分布式体系结构,则在负责事件的服务中处理模型的计算。它是否只是一个小API,请保持简单,将其放在您或您的团队最期望的地方。

Iam使用第二种方法,因为实体可以包含可以由应用程序流修改的原始API

公共模式正是您希望在应用程序层之间传输数据的模式,可以将数据转换为所需的输出。Dto不能包含业务逻辑,但也可以“准备”、“减少”目标所需的数据

例如:
如果表示层需要,我将在模型中而不是实体中执行此操作。 在实体中这样做将导致无休止的修改

另一个示例可以是用户的全名
Firstname
Lastname
academicedge

实体可以持有所有资产,但

  • 一次演示需要[学位][名字][姓氏]和
  • 第二,需要不同格式的数据,如[lastname] [名字][学位]

用特定的DTO而不是实体IMHO生成所需的格式是很好的保留属性

我在ASP.NETCore中是在onion架构和视图模型中这样做的,根据我的经验,它很容易管理、更改、准备前端或层的数据,而不是更改Core中的某些内容

如果有人不同意我,请发表评论,我喜欢学习新东西

希望是h