2008-12-17 53 views
2

当您的域或业务层(无论您想要调用它)是否与您的用户界面完全分离时,它如何收集所需信息完成请求?域层向用户界面发出呼叫的最佳方式

例如,假设用户界面发出添加一行到采购订单的请求,业务规则确定您出于某种原因需要授权码。领域层如何传达这一点?返回某种表示需要授权的响应代码?发起“需要授权”事件并查看是否有人回应?接受UI将实现的某种IAuthorizationProvider?

所有这些看起来都没问题,但我很担心企业可能需要的可能事情爆发。继续购买订单示例,如果某些项目需要颜色,该怎么办?有些需要有危险材料声明ID?有些需要一个简单的“这很少见,你确定吗?”。该清单可以继续。这感觉就像决定你需要这个信息绝对属于领域层。在非分层应用程序中,您只需弹出一个对话框并获取所需内容。你如何在一个正确的分层应用程序中做到这一点?

回答

0

我已经做了一些更多的阅读并发现了Martin Fowler的Notification Pattern,这似乎是为了解决这个问题以及Jeremy Miller的Domain Centric Validation with the Notification Pattern

这是通知的福勒的描述,它描述几乎正是我一直在寻找:

收集在一起有关领域层错误和其他信息,并将其传送到演示文稿对象。

+0

在某些情况下,通知是通过例外来实现的。在其他情况下,它是一个带有属性名称的错误词典和带有单个错误消息的错误列表(或列表)。 – 2008-12-17 21:00:35

1

演示者或控制器,取决于如果你做MVC或MVP应该知道它,而不是域,域将会断言(防御性编码)是所有需要的值都OK,或抛出异常,不要求它。

因此,假设您不提供数字,您的模型会抛出AuthorizationNumberRequiredException,那么您的演示者将从那里处理它。因此,您的域名与主持人无关,它只是抛出错误,主持人必须知道如何处理它,但它不会重复逻辑。

+1

但这些显然是业务规则。他们为什么会出现在与UI有关的主持人中。假设我在一个没有主持人的服务中使用这个域 - 我是否会重复服务中的规则? – 2008-12-17 18:16:06

1

某处的UI必须在某个点将信息传递到业务层。无论您是否正在浏览控制器等中间对象,业务层需要确定PO是否处于有效状态。如果不是,则返回说明错误的信息。这可以从PurchaseOrder.AddLineItem方法调用或者可能的PurchaseOrder.Validate方法中进行。我的首选是从PurchaseOrder.AddLineItem方法返回验证信息,以便您可以确定对象状态在那里是无效的。

2

“...业务规则确定您出于某种原因需要授权代码。域层如何与之通信?”

这就是API的用途。你有几个选择。

  1. 业务规则API只是列出业务规则需要的各种东西。用户界面负责提出完整的请求。这些东西不是动态的。这不像业务规则随机变化。有这种事情的版本控制。

  2. 异常工作正常。该请求引发异常,因为它不完整。 API指定异常以及如何在没有异常的情况下发出“完整”请求。

  3. AuthorizationProvider的计划也不错。该API将被定义为澄清对AuthorizationProvider执行的请求。

“我为可能发生的事情发生了很大的变化......这份名单可以继续下去。”事实上,它没有。只需定义适合问题域的适当API。

如果 - 出于某种原因 - 您害怕无法定义API,那么您也无法定义问题。

“但是......怎么样”,例如,有些物品有颜色或MSDS。怎么样的一个配置对话框?

  1. 颜色 - 或其他详细信息,如MSDS。首先,该模型具有“需要颜色”设置。用户界面只需检查是否需要颜色对话框。这些只有有限的一部分,所有这些都是你正在解决的问题的一部分,并且都可以列举出来。

  2. 确认稀有物品。同样,业务规则具有“需要确认”的属性或方法。用户界面检查这一点。这些只有有限的一部分,所有这些都是你正在解决的问题的一部分,并且都可以列举出来。

您不会弹出一个新的对话框。使用单独的用户界面和业务规则,您现在可以做两件事:

  • 将信息添加到业务规则;
  • 使UI检查弹出对话框。

您不会添加大量的代码。业务规则属性是几行代码。 UI检查是一行代码。

相关问题