Tom*_*Tom 3 c# model-view-controller automapper dapper
这个问题是要验证当前的实现是否是最佳实践和性能方面的正确方法.到目前为止,在我以前的所有公司中,我一直使用Auto Mapper将关系对象映射到域模型实体,将域模型实体映射到Dtos.ORM工具是Entity框架.在我目前的公司中,他们使用Dapper作为ORM工具,并且不使用AutoMapper,因为他们说Dapper在内部为您做映射.因此,他们构建项目的方式是创建一个单独的类库项目,该项目包含Dtos并引用Dataccess和Business层中的Dtos.Dapper返回的查询内部映射到Dtos.这些Dtos将返回到Business层,依此类推.
例如
在下面的代码中,Participant功能是Dto.
DataAccess层中的存储库文件
public List<ParticipantFunction> GetParticipantFunctions(int workflowId)
{
// Update the Action for Participant
string selectSql = @"SELECT [WFPatFunc_ID] AS WFPatFuncID
,[WFFunction]
,[SubIndustryID]
,[DepartmentID]
FROM [dbo].[WF_ParticipantsFunctions]
WHERE [DepartmentID] = (SELECT TOP 1 [DepartmentID] FROM [dbo].[WF] WHERE [WF_ID] = @workflowId)";
return _unitOfWork.GetConnection().Query<ParticipantFunction>(selectSql, new
{
workflowId = workflowId
}).ToList();
}
Run Code Online (Sandbox Code Playgroud)
开发人员告诉我的原因是AutoMapper只是一个开销并降低了速度,而且由于Dapper在内部进行映射,因此不需要它.
我想知道他们所遵循的做法是否合适并且没有问题.
Mar*_*ell 12
这里是没有对错.如果当前系统工作并解决了他们的所有要求,那么很好:使用它!如果你真的需要自动映射器有用的东西,那么很棒:使用它!
但是:如果你不需要自动映射器所做的事情(并且看起来它们没有),那么......不要使用它?
也许一个关键点/问题是:如果您的需求稍后更改,您的重构代码的能力是什么?对于很多人来说,答案是"确定,我们可以改变东西" - 所以在这种情况下我会说:推迟添加一个额外的层,直到你真正需要一个额外的层.
如果您以后绝对无法更改代码,可能是由于许多面向公众的API(软件作为产品),那么现在解除所有内容是有意义的,因此公共API中没有耦合/依赖.但是:大多数人都没有.除此之外,小巧玲珑对你的型号没有任何要求,除了:它必须看起来有点像桌子.如果它这样做,那么:如果你不需要它,为什么要添加一个额外的层?
这更多是架构问题,没有好坏之分。
DTO的优点:
分层 -您没有直接使用数据对象,因此可以将属性用于映射和UI中不需要的东西。这样,你可以在没有依赖于数据访问的东西库的DTO的。(请注意,您可以用流利的映射,但这样一来,你可以用你喜欢这样做)
修改 -如果您更改域模型,则您的公共接口将保持不变。可以说,您向模型添加了一个属性,而您已经构建的所有东西都将无缘无故地在JSON中获取新字段。
安全性 -这就是为什么如果我没记错的话,Microsoft开始推销DTO的原因,我认为CodePlex(不是100%确定是它们)直接使用EF授权将内容添加到数据库中。有人弄清楚了这一点,然后用不允许访问的内容扩展了JSON,例如,如果您的某篇文章引用了用户,则可以通过更改跟踪来添加新帖子,从而更改用户的角色。有多种方法可以保护您免受这种情况的侵害,但是安全性始终应该是退出,而不是退出。
当我需要将BI级别公开给公共接口时,我喜欢使用DTO。例如,如果我有一个具有系统操作的API,例如api / Users / AllUsers或api / Users / GetFilteredUsers。
没有DTO
性能 -通常不使用DTO将运行得更快。没有多余的映射步骤。投影可以帮助您解决问题,但是当您知道需要做什么时,您可以真正进行优化。
开发速度和较小的代码库 -有时大型架构是一个过大的杀伤力,而您只是想把事情做好。而且,您在大部分时间中都不会只是复制属性。
更高的灵活性 -这与安全性相反,有时您希望使用相同的api来完成一件事。例如,如果要让UI决定要从大对象看到的内容。像选择和扩展。(请注意,这可以使用DTO来完成,但是如果您曾经尝试使用DTO进行扩展,您就会知道它会变得多么棘手)
如果需要使用Breeze或JayData和/或Odata,则在需要向客户端公开数据访问级别时使用它。使用像api / Users和 api / Users这样的api ?filter =(a => a.Value> 5)