C# 重构fat控制器并在服务层中处理验证和日志记录

C# 重构fat控制器并在服务层中处理验证和日志记录,c#,entity-framework,asp.net-mvc-4,dto,business-logic,C#,Entity Framework,Asp.net Mvc 4,Dto,Business Logic,我目前有一个应用程序受Fat控制器的影响。我试图将业务逻辑拉入服务层,并希望澄清我的方法 为了提高模型误差,我计划使用如下所述的方法:-大约1/2的时间使用IValidationDictionary方法 但我看到在新版本的文档中没有讨论这种方法。在较新版本中,服务层部分中的验证将被完全删除 我希望这足以让我提出以下问题/验证我的方法: 我认为上面链接中的方法已经过时,不应该用于数据注释(可能会覆盖IsValid-这可能很幼稚,我还不完全理解验证ModelState.IsValid的工作流)。我的

我目前有一个应用程序受Fat控制器的影响。我试图将业务逻辑拉入服务层,并希望澄清我的方法

为了提高模型误差,我计划使用如下所述的方法:-大约1/2的时间使用IValidationDictionary方法

但我看到在新版本的文档中没有讨论这种方法。在较新版本中,服务层部分中的验证将被完全删除

我希望这足以让我提出以下问题/验证我的方法:

  • 我认为上面链接中的方法已经过时,不应该用于数据注释(可能会覆盖IsValid-这可能很幼稚,我还不完全理解验证ModelState.IsValid的工作流)。我的理解是否正确,或者这些是不同的关注点
  • 我希望将强类型视图混合到两个实体(在字段到实体的1-1映射的简单表单上)和DTO(在映射到实体的不太简单的表单上)。是否可以让实体验证冒泡到DTO,以避免重复非业务需求验证?在没有DTO的强类型实体上,我应该在实体上包括业务逻辑验证吗(这似乎是错误的)?我是否正确地考虑/处理了这个问题
  • 该站点正在使用存储库方法—我是否可以跳过服务层,让业务逻辑分布在数据注释和存储库中?我又问对问题了吗
  • DataAnnotation是当前(MVC4)的模型验证最佳实践方法。就模型验证的工作流而言,验证发生在模型绑定时,即MVC框架检查来自请求的值并尝试绑定/补充/填充请求所针对的操作方法中列出的参数时

  • 在MVC中使用服务层时,将DTO与MVC中的视图模型合并是非常自然和方便的。两者的目的都是仅封装将在两点之间传递的数据。所以我想说,创建一个类用作DTO和View模型,并用DataAnnotation标记其属性以进行模型验证

  • 这个问题有点主观,还取决于所部署应用程序的预期网络体系结构。如果您的目标是一个具有web、应用程序和数据库服务器的三层部署体系结构,那么服务/应用程序层是固有的,也是必要的。也就是说,如果没有设置网络架构,则可能没有真正的理由拥有服务层,特别是如果不需要其他应用程序(内部或外部)来使用服务层中包含的逻辑。在模型验证和存储库中实现业务逻辑是非常好的

  • DataAnnotation是当前(MVC4)的模型验证最佳实践方法。就模型验证的工作流而言,验证发生在模型绑定时,即MVC框架检查来自请求的值并尝试绑定/补充/填充请求所针对的操作方法中列出的参数时

  • 在MVC中使用服务层时,将DTO与MVC中的视图模型合并是非常自然和方便的。两者的目的都是仅封装将在两点之间传递的数据。所以我想说,创建一个类用作DTO和View模型,并用DataAnnotation标记其属性以进行模型验证

  • 这个问题有点主观,还取决于所部署应用程序的预期网络体系结构。如果您的目标是一个具有web、应用程序和数据库服务器的三层部署体系结构,那么服务/应用程序层是固有的,也是必要的。也就是说,如果没有设置网络架构,则可能没有真正的理由拥有服务层,特别是如果不需要其他应用程序(内部或外部)来使用服务层中包含的逻辑。在模型验证和存储库中实现业务逻辑是非常好的


  • 如果一个视图可以直接绑定到一个实体,我是否应该创建一个DTO或视图模型来封装EF之外的业务逻辑验证?第二,在ViewModel上复制我的EF注释以在模型绑定时验证它们是否被普遍接受?这是一个有其利弊的好问题。一方面,由于视图与实体一一对应,因此无需拥有视图模型,另一方面,一致性始终是一种良好做法,因此创建视图模型可能是合理的,这样您就可以始终在那里查找业务规则,而不管实体是什么。此外,如果您有一个服务层,那么不管怎样,您都需要DTO。在任何一种情况下,您都应该只在一个位置放置注释以避免混淆,并且只有一种类型可以用作视图的模型并将被验证。如果视图可以直接绑定到实体,我是否仍应该创建DTO或视图模型来封装EF之外的业务逻辑验证?第二,在ViewModel上复制我的EF注释以在模型绑定时验证它们是否被普遍接受?这是一个有其利弊的好问题。一方面,由于视图与实体一一对应,因此无需拥有视图模型,另一方面,一致性始终是一个良好的实践,因此创建视图模型可能是合理的,这样您就可以始终在那里查找业务规则,而不管实体是什么