我有一个问题域,其中用户应该能够创建“ProductType”对象,其中每个ProductType对象应该具有聚合的“ProductTypeProperties”列表,并且每个ProductTypeProperty对象应该具有聚合的“ProductTypePropertyValues”列表。
用户能够创建“Product”对象并将少量ProductTypes与之关联。
当用户将Product与少量ProductTypes相关联时,用户可以为Product对象指定ProductTypeProperties的值。
ProductTypeProperties可以具有属于不同选择模式的值,例如:“one-choose”,“multiple-choose”和“string / integer / decimal input”
我不确定如何设计这样的域对象模型。特别是如何在Product对象上应用ProductType的属性值。
我不介意此时的持久性,只关于对象域模型,因为我可以自由选择SQL / Document / Object / Graph数据库。
对象结构现在看起来像这样:
ProductType
List<ProductTypeProperty>
List<ProductTypePropertyValue>
Product
List<ProductType>
我现在使用的C#类定义是:
public class Product {
public string Name { get; set; }
public List<ProductType> AssociatedProductTypes { get; set; }
// how to apply ProductType's property values to a Product object?
}
public class ProductType {
public string Name { get; set; }
public List<ProductTypeProperty> AggregatedProperties { get; set; }
}
public class ProductTypeProperty {
public string Name { get; set; }
public List<ProductTypePropertyValue> AggregatedAvailableValues { get; set; }
}
public class ProductTypePropertyValue {
public string Name { get; set; }
}
看起来试图在对象中应用类/对象结构,其中“ProductType”是“类”,“Product”是“对象”,可以是实例“ProductTypes”和“inherit”属性和可用值来自每种相关产品类型。
我从未做过像这样的对象模型,所以如何做到这一点非常有趣。 感谢您的任何想法和建议。
答案 0 :(得分:2)
您可以按如下方式映射ProductTypeProperty:
通用基本属性类,其中TValue将确定属性值的类型(可以是字符串,十进制,整数或多选):
public abstract class ProductTypePropertyBase<TValue>
{
public string Name { get; set; }
public TValue Value { get; set; }
protected ProductTypePropertyBase(string name, TValue value)
{
Name = name;
Value = value;
}
}
为每种类型的属性创建一个嵌套类,例如,您可以创建一个简单的字符串属性:
public class ProductTypeStringProperty : ProductTypePropertyBase<string>
{
public ProductTypeStringProperty(string name, string value) : base(name, value)
{
}
}
对于复杂的属性类型,您可以实现多种选择:
public class ProductTypeMultipleChoiceProperty : ProductTypePropertyBase<MultipleChoiceValue>
{
public ProductTypeMultipleChoiceProperty(string name, MultipleChoiceValue value) : base(name, value)
{
}
}
其中MultipleChoiceValue是另一种表示字符串列表的类型。