gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 14:31:09 27 4
gpt4 key购买 nike

我正在寻找有关设计契约(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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com