Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/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
Design patterns 在服务层或业务对象中进行验证和验证?_Design Patterns_Business Objects_Csla - Fatal编程技术网

Design patterns 在服务层或业务对象中进行验证和验证?

Design patterns 在服务层或业务对象中进行验证和验证?,design-patterns,business-objects,csla,Design Patterns,Business Objects,Csla,使用服务层作为域模型和“数据加载程序”之间的边界。然而,Rockford Lhotka建议将验证构建到业务对象本身中,这正是CSLA.NET所做的 将其抽象到服务层的好处显然是,您的服务层可以跨多个业务对象协调活动/操作。但是,与直接使用业务对象进行业务逻辑和验证相比,使用服务层还有哪些优点和缺点呢?我肯定属于Rocky Lhotka阵营。我相信您的业务对象应该很容易在应用程序和UI层之间“移植”。添加一个额外的“服务层”很可能会增加对对象的依赖性,从而降低对象的“可移植性” 如果正确编写业务对

使用服务层作为域模型和“数据加载程序”之间的边界。然而,Rockford Lhotka建议将验证构建到业务对象本身中,这正是CSLA.NET所做的


将其抽象到服务层的好处显然是,您的服务层可以跨多个业务对象协调活动/操作。但是,与直接使用业务对象进行业务逻辑和验证相比,使用服务层还有哪些优点和缺点呢?

我肯定属于Rocky Lhotka阵营。我相信您的业务对象应该很容易在应用程序和UI层之间“移植”。添加一个额外的“服务层”很可能会增加对对象的依赖性,从而降低对象的“可移植性”


如果正确编写业务对象框架,那么业务对象应该能够正确处理各种业务对象之间的验证。CSLA.NET通过拥有父/子关系以及从属属性有效性的概念正确地做到了这一点。

我不确定您是否已经理解了这一点

PEAA中的Martin Fowler建议,服务层是UI(或客户端)和域/数据层之间的API。它将公开客户端可以使用的任何功能

如果您查看域模型()

包含行为和数据的域的对象模型

域层将包含这些对象,这些对象将具有操作/验证(行为)和状态(数据)

这些对象可以在其他应用程序中重用,这也取决于您的设计。域层不应依赖于服务层

因此,考虑到域对象具有行为(包括验证)和数据。服务层是您希望应用程序公开的(功能上要公开的)。增加一个客户或帐户,计算月底的账单

看看夏普建筑的布局()

这是我对这种材料的理解


bones

我正在寻找一个更灵活的领域模型,其中数据和行为是分离的,但我不认为服务层是行为的合适层。相反,也许可以采取一种简单的业务逻辑层方法,其中业务实体对象仅公开数据,业务流程对象仅公开行为,其中包括验证方法

一个好处是,根据业务流程耦合的松散程度,您可以将验证应用于更广泛的协变项,甚至可能是不变类型。请考虑一下“FrestNew”和“LaSTNEX”字段,并进一步考虑这些字段可能在任意大系统中存在于半打或更多不同的实体上。将流程与数据分离将确保您可以一次性实现验证流程,并将其应用于提供相同数据的多个对象

我注意到,领域模型“应该”由融合了数据和行为的领域对象组成的理想是Fowler/Evans的一个概念,大约在2000-2002年(在快速向分布式信息系统而不是两层应用程序迁移之后不久)


想法?

我还想补充一点,一些业务对象也可能用于进行协调。例如,您不需要编写将订单转换为发票所需的行为,您需要一个OrderConverter,它将检查订单,如果有效,则将其转换。我通常认为的“服务”对象基本上是一个几乎不相关的方法的垃圾场。他们都对商店做了些什么,但除此之外没有什么关系。在Csla中,这些方法通常会被封装到单独的类中,这些类对用例有充分的了解,也就是说,它知道如何将订单生成发票