我正面临一个与如何将自定义字段附加到系统中的实体相关的关键设计问题.实体用C#表示并保存在RavenDB中.我们大致跟随域驱动设计的租户,我们的实体是聚合根.
[注意:我想避免围绕DDD方法中的自定义字段等通用功能的适当性进行辩论.假设我们有合法的用户需要附加和向我们的实体显示任意数据.此外,我已经将我的示例设为通用,以说明设计挑战.:)]
我的问题是关于如何最好地布置字段定义和字段值实例.
想象一下我们拥有Book and Author集合根的域.我们希望用户能够将任意数据属性附加到Books和Authors的实例.所以,我们可以用这样的类定义一个自定义字段:
public enum CustomFieldType
{
Text,
Numeric,
DateTime,
SingleSelect,
MultiSelect
}
public class CustomFieldDefinition
{
public string Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public CustomFieldType Type { get; set; }
public Collection<string> Options { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
附加到Book的 CustomFieldDefinition(CFD)可能具有以下值:
我面临的第一个问题是在每本书的实例上存储什么.选择范围从......
只存储CFD Id和实例值
至
存储整个差价合约以及价值
"低端"很糟糕,因为我不能在没有拉入CFD的情况下显示一本书,这是在另一份文件中.另外,如果我以任何方式更改差价合约,我都会更改历史文档中值的含义. …