我一直在阅读有关例外及其使用的一些问题和答案.似乎是一种强烈的观点,即只应针对异常,未处理的案例提出例外.这让我想知道验证如何与业务对象一起工作.
假设我有一个业务对象,其中包含对象属性的getter/setter.假设我需要验证该值是否介于10和20之间.这是一个业务规则,因此它属于我的业务对象.所以这似乎意味着我的验证码在我的二传手中.现在我将UI数据绑定到数据对象的属性.用户输入5,因此规则需要失败,并且不允许用户移出文本框..UI被数据绑定到属性,因此将调用setter,规则检查并失败.如果我从业务对象中引发异常以说规则失败,则UI会选择该规则.但这似乎违背了例外的首选用法.鉴于它是一个制定者,你实际上并不会对setter产生"结果".
那么验证应该如何运作呢?
编辑:我可能在这里使用了一个过于简化的例子.上面的范围检查之类的东西可以通过UI轻松处理,但是如果valdation更复杂,例如业务对象根据输入计算数字,如果计算出的数字超出范围,则应该重新注入.这是更复杂的逻辑,不应该在UI中.
还可以考虑根据已输入的字段输入的其他数据.例如,我必须在订单上输入一个项目以获得某些信息,例如库存,当前成本等.用户可能要求此信息做出进一步进入的决定(请说明订购了多少个单位)或者可能需要订购进一步验证.如果该项目无效,用户是否应该能够输入其他字段?重点是什么?
我得到了创建业务对象或实体来表示类似Person的概念.然后我可以使用DTO序列化Person并将其发送给客户端.如果客户端更改了对象,它可以在那里有一个IsDirty标志,所以当它被发送回服务器时,我知道要更新它.
但是如果我有一个Order对象呢?这有主页头信息,客户,供应商,所需日期等.然后它有OrderItems,它是一个List <OrderItem>,是要订购的项目.我希望能够在我的UI上使用此业务对象.所以我有一些文本框连接到位置,供应商,所需日期等,并且网格连接到OrderItems.由于OrderItems是一个List,我可以轻松地添加和删除记录.但是我该如何跟踪这个,特别是删除的项目.我不希望删除的项目在我的网格中可见,如果我使用foreach,我不应该迭代它们,因为它们已被删除.但是我仍然需要跟踪删除的事实.如何跟踪更改.我想我需要使用一个单位的工作?但随后代码似乎变得相当复杂.那么我想知道为什么不简单地使用DataTables并免费获得更改跟踪?但后来我读到了业务对象是如何实现的.
我在简单的Person示例中找到了各种示例,bnut不是像Orders这样的标题详细示例.
BTW使用C#3.5.