c# - 如何设计处理(真实)契约(Contract)的数据模型?

标签 c# nhibernate domain-driven-design

我正在寻找有关设计契约(Contract)管理数据模型的建议。因此,合约的一般生命周期是:

  • 契约(Contract)已创建并处于“草稿”状态。它可以在内部查看,并且可以进行更改。
  • 契约(Contract)发给供应商,状态设置为“待定”
  • 契约(Contract)被供应商拒绝。在此状态下,无法对合约进行任何操作。不得向集合中添加任何状态。
  • 供应商接受了契约(Contract)。在此状态下,无法对合约进行任何操作。不得向集合中添加任何状态。

我显然想避免契约(Contract)被接受的情况,比如说,金额被改变了。这是我的类(class):

[EnforceNoChangesAfterDraftState]
public class VendorContract 
{
 public virtual Vendor Vendor { get; set; }            
 public virtual decimal Amount { get; set; }
 public virtual VendorContact VendorContact { get; set; }              
 public virtual string CreatedBy { get; set; }
 public virtual DateTime CreatedOn { get; set; }
 public virtual FileStore Contract { get; set; }

 public virtual IList<VendorContractStatus> ContractStatus { get; set; } 
}        

[EnforceCorrectWorkflow]
public class VendorContractStatus
{
  public virtual VendorContract VendorContract { get; set; }
  public virtual FileStore ExecutedDocument { get; set; }
  public virtual string Status { get; set; }
  public virtual string Reason { get; set; }
  public virtual string CreatedBy { get; set; }
  public virtual DateTime CreatedOn { get; set; }
}

我省略了文件存储类,它基本上是一个键/值查找,用于根据其 guid 查找文档。

VendorContractStatus 在 Nhibernate 中被映射为多对一。

然后我按照 here 所述使用自定义验证器.如果 VendorContractStatus 集合中返回草稿以外的任何内容,则不允许进行任何更改。此外,VendorContractStatus 必须遵循正确的工作流程(您可以在待定之后添加拒绝,但如果存在拒绝或接受等,则不能向集合中添加任何其他内容)。

一切都好吗?好吧,一位同事认为我们应该简单地向 VendorContract 添加一个“IsDraft”bool 属性,如果 IsDraft 为 false,则不接受更新。然后我们应该在 VendorContractStatus 内部设置一个方法来更新状态,如果在草稿后添加了一些东西,它将 VendorContract 的 IsDraft 属性设置为 false。

我不喜欢这样,因为感觉我在弄脏 POCO 并添加应该在验证区域中持续存在的逻辑,这些类中不应该真正存在任何规则,它们不应该知道它们的状态。

对此有何想法?从 DDD 的角度来看,更好的做法是什么?

在我看来,如果将来我们想要更复杂的规则,从长远来看,我的方法将更易于维护。假设我们有一定数量的契约(Contract)需要经理批准。我认为与 VendorContractApproval 类进行一对一映射比添加 IsApproved 属性更好,但这只是推测。

这可能有些离谱,但这是我们完成的第一个真正坚韧不拔的企业软件项目。任何建议将不胜感激!

最佳答案

需要考虑两件事;

1) 您真的想要契约(Contract)请求和生效契约(Contract)使用相同的对象模型吗?他们不会有不同的用例吗?

2) 如果你确实想使用同一个对象,这可能是使用 state pattern 的好例子。控制哪些操作对当前状态有效。

关于c# - 如何设计处理(真实)契约(Contract)的数据模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2547012/

相关文章:

c# - 为什么比较 float 和 double 时会出现此输出

nhibernate - 如何强制NHibernate不更新集合中的所有对象

c# - NHibernate.查询异常 : duplicate association path

nhibernate - 如何在 Fluent NHibernate 中设置默认事务隔离级别?

c# - 返回接口(interface)的通用方法

c# - 什么时候使用 Mock v. Stub,或者什么都不用?

c# - 如果客户端验证失败显示消息?

c# - BAL 中的依赖注入(inject)而不添加对 DAL 的项目引用

domain-driven-design - 在命令处理程序/域服务中使用查询模型

domain-driven-design - 在领域驱动设计中实现限界上下文