我正在设计一个项目,其中所有主要组件共享一个共同的DomainObject(是的,我从O / RM世界偷了这个词,但它不是相当一个O / RM项目。)DomainObject维护对象更改状态(脏/清除)并允许自己回滚或提交(AcceptChanges(),RejectChanges())。在对象上调用AcceptChanges()时,它会触发一个事件,该事件将触发将hte值写入基础数据存储区。此外,它传递一个参数,允许在事件中取消持久性。
1)实例化课堂(DomainObject)并修改其属性。
2)调用Classroom.AcceptChanges(),触发OnAcceptEvent并传递DomainObjectChangeEventArgs,其中包含一个名为Cancel的布尔属性 3)如果事件未取消,则接受更改并更新教室的状态 4)然后项目在任何也是DomainObjects的内部属性上调用AcceptChanges,例如Student。
5)每个学生触发OnAcceptEvent传递DomainObjectChangeEventArgs ...等。
现在,向整个社区提问:
A)您是否在课堂的AcceptEvent上有取消指示器停止整个过程,迫使它不再评估并可能接受任何学生,或者您是否将取消编码仅适用于教室。 b)任何学生的取消指示是否应该停止对任何其他学生的处理?
我最初的想法是,课堂活动的取消指示应该停止整个过程,因此可以优雅地保留课堂和所有学生的预先接受状态而不涉及交易的开销。但我并不是必须确信我是对的。
你会做什么?
答案 0 :(得分:1)
我认为你赚钱了。
答案 1 :(得分:1)
是的,你应该在任何一种情况下取消整个过程。您在对象图的根上调用accept,因此消费者的期望将是整个图持久化。我会把这视为一种全有或全无的情况。
答案 2 :(得分:1)
我会调用事件CanSave,它返回一个枚举{OK,Cancel}。在持久化之前,我会查询整个对象图,寻找取消。每个对象都可以验证自身并取消它,如果它当前不在可持久状态...避免大多数,但绝不是全部,回滚。
但是你可以用取消做什么?优秀软件的主要标准之一是“ Allways 允许用户保存工作”。程序员不会遵守不能保存无法编译的源代码的IDE,那么为什么您希望用户能够使用它呢?
取消状态应该是真正的例外状态...就像无法写入只读文件一样 - > “另存为”而不是?或者是空键字段 - > “用户名是必需的”。
那么替代方案是什么?保存为中间格式,可存储“无效”数据...如文本文件。
除此之外:我经常认为数据库应用程序缺少“验证”按钮,允许用户找出“这样可以吗?”没有真正承诺。
只是值得深思。
干杯。基思。
答案 3 :(得分:1)
如果说将学生添加到班级中只会修改班级的状态(比如你在同一个班级中存储哪个学生在班级,更多的学生班级可以有等等),那么你不需要坚持学生对象。
如果添加到此类或从此类中删除修改学生类(如他们可以采取的更多类的数量等),那么您也应该将取消传播到学生对象。