Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.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
Asp.net mvc 在ASP.NET MVC中将实体映射到模型并执行业务逻辑_Asp.net Mvc_Architecture_N Tier Architecture - Fatal编程技术网

Asp.net mvc 在ASP.NET MVC中将实体映射到模型并执行业务逻辑

Asp.net mvc 在ASP.NET MVC中将实体映射到模型并执行业务逻辑,asp.net-mvc,architecture,n-tier-architecture,Asp.net Mvc,Architecture,N Tier Architecture,将数据库实体映射到模型并执行业务逻辑的最佳实践是什么?我已经看到了这两种方法的不同实现。我注意到许多实现,其中存储库(在数据层中)本身负责将数据库实体映射到域模型。例如,可以执行此操作的存储库: public IQueryable<Person> GetPersons() { return DbSet.Select(s => new Person { Id = s.Id,

将数据库实体映射到模型并执行业务逻辑的最佳实践是什么?我已经看到了这两种方法的不同实现。我注意到许多实现,其中存储库(在数据层中)本身负责将数据库实体映射到域模型。例如,可以执行此操作的存储库:

public IQueryable<Person> GetPersons()
{
      return DbSet.Select(s => new Person
                    {
                        Id = s.Id,
                        FirstName= s.FirstName,
                        Surname= s.Surname,
                        Location = s.Location,
                    });
}
publicIQueryable GetPersons()
{
返回DbSet.Select(s=>newperson
{
Id=s.Id,
FirstName=s.FirstName,
姓氏,
位置=s.位置,
});
}
但是在全面搜索了N层设计之后,我注意到虽然没有银弹,但在大多数情况下,建议手动或使用映射器在MVC项目的控制器内部执行映射。还有人重申,服务层永远不应该执行映射,它的责任应该是执行业务逻辑。这里有几个问题:

  • 在将实体映射到模型以及将实体映射到模型的位置方面,建议使用哪种方法?存储库应该这样做还是应该在控制器中进行映射
  • 假设我想对从数据库中检索到的实体执行一些业务逻辑,例如,返回
    人员
    的全名,或者将所有
    人员
    的年龄增加10年,应该在哪里执行此操作。关于模型本身?例如,我会在模型上有一个
    FullName
    属性来计算全名和年龄吗?还是在我的服务层中定义一些服务来执行业务逻辑
  • 编辑

    哇,这么多票数相近的人。抱歉,我搜索得不够全面。我在这里提出的“在何处执行业务逻辑”问题可以在SO和其他地方找到(尽管有时表达得有些神秘):


    然而,我还没有找到一个标准的解决方案来解决我的映射问题,我想我也许可以更雄辩地表达我的问题。因此,普遍的共识似乎是业务逻辑在服务层,而将域模型映射到视图模型应该在控制器/表示层进行。由于不建议将DB实体表面化到数据层以外的任何层,因此建议手动或通过映射器(如Auto mapper)将实体映射到数据层的域模型(这是我从阅读许多文章中收集到的)。我的困惑源于将实体映射到域模型和将域模型映射到视图模型的问题。然而,正如我先前提到的,我本可以更清楚地表达我的问题。我感到困惑的原因是,我读到,实体到域模型的映射应该发生在控制器中,这应该被重新表述为“将实体映射到域模型应该稍后在数据中进行,将域模型映射到视图模型应该在控制器中进行。

    我通常在MVC项目中创建一个小型服务层,以处理MVC层需要完成的额外工作。因此,在您的示例中,您可以有一个
    PersonService
    PersonHandler
    ,它调用您的业务层来获取所有人员实体,然后将所有人员的年龄增加10岁(假设这不是您的业务逻辑,而是UI需要的东西),连接名字和姓氏以构建全名等。控制器然后只调用此服务,永远不知道幕后发生了什么。这样,您的控制器就完成了理想情况下应该做的事情——在视图和模型之间进行协调

  • 关于实体映射到何处,建议使用哪种方法 模型,反之亦然?存储库应该这样做还是 映射可以在控制器中完成吗
  • 我强烈希望看到映射发生在存储库中,而不是控制器中。控制者需要像Suhas在回答中提到的那样纯粹充当协调人。或者,您可以利用存储库中的映射类传递实体并返回映射模型,类似于

  • 假设我想对我创建的实体执行一些业务逻辑 例如,从数据库中检索,返回 将所有人的年龄提高10岁, 应在何处执行此操作。关于模型本身?对于 例如,我在模型上有一个全名属性 计算全名和年龄?或者我在里面定义了一些服务 我的服务层执行业务逻辑
  • 如果可能,对服务执行业务逻辑。为什么要让应用程序承担服务层应该做的事情?我相信这是服务的领域,而不是应用的领域。此外,我也不认为从模型返回连接或派生属性是一件坏事

    总结:

    • 控制器处理来自视图的请求并将其转发给 存储库
    • 存储库是通向数据存储的管道
    • 服务处理来自存储库的请求,处理业务逻辑, 并返回映射模型
    这取决于。。。 就像你说的没有银弹。我们只能列出每种方法的优缺点,但仍然是您比这里的任何人都更了解自己的需求。 如果你有时间,我建议你读这本书。这将使您很好地了解不同的业务逻辑和数据源体系结构模式,以及何时和如何使用它们。什么应该进入业务层?什么