【问题标题】:Develop application layer which has no dependencies to Presentation Layer?开发不依赖于表示层的应用层?
【发布时间】:2011-10-16 21:12:53
【问题描述】:
我正在学习一般的发展策略,但我对它们有很多疑问。其中之一是关于创建不应具有依赖关系的应用层表示层。
例如,在 MVC 应用程序中,假设我们有应用程序服务,但此应用程序服务不检查来自表示层的传入数据模型的验证。它仅通过 ASP.NET MVC 验证在控制器中检入,而且服务层不包含任何授权内容。所有工作都在表示层完成。你认为这是正确的架构吗?我是否必须再次在服务层中包含所有验证和授权?如果你说是,但如何?
如何在服务层中包含授权?我真的不知道如何控制服务层内的授权。在服务层中复制验证也可以吗?
毕竟,如果我确定表示层永远不会改变,那么做这样的设计真的值得吗?
【问题讨论】:
标签:
model-view-controller
domain-driven-design
service-layer
presentation-layer
【解决方案1】:
验证应该在领域层。在 DDD 应用程序中,域(业务)层应该拥有验证,因为它最了解自己。服务层对域进行操作,并应处理由域层引发的错误,包括验证错误。在这种情况下处理错误可能意味着将其包装在服务层异常中并返回错误代码、记录错误等。授权也应该是服务层的责任。这并不是说表示层(ASP.NET MVC)不应该执行验证或授权验证。表示层中的验证通常比域和服务层中的验证更轻量级,并且这样做是为了改善用户体验。毕竟,如果大部分验证都可以在客户端执行,为什么不这样做并省去一趟服务层呢?相同的逻辑适用于授权。
关于验证逻辑的重复,没有可以满足所有情况的解决方案,有时您必须接受一些重复以降低整体复杂性并提高可维护性。在域层中进行验证的最简单方法是使用标准守卫并抛出 ArgumentException 实例。在 ASP.NET MVC 中,进行验证的最简单方法是使用数据注释属性。通常,在某种程度上复制验证逻辑比实现一个包罗万象的验证系统更容易。此外,可能存在只能由域层执行的验证,这是将它们分开的另一个论据。
服务层中的授权可以通过多种方式完成,并且取决于所使用的底层技术。如果使用 WCF 有很多 guidelines 进行授权。