Справка по моделированию домена: Product & ProductType & ProductyTypeProperties & ProductyTypePropertyValues - PullRequest
1 голос
/ 01 июля 2011

У меня есть проблемный домен, где пользователь должен иметь возможность создать объект «ProductType», в котором каждый объект ProductType должен иметь агрегированный список «ProductTypeProperties», а каждый объект ProductTypeProperty должен иметь агрегированный список «ProductTypePropertyValues».

После этого пользователь может создать объект «Product» и связать с ним несколько ProductTypes.

Когда пользователь связывает Product с несколькими ProductTypes, он может указывать значения ProductTypeProperties для объекта Product.

ProductTypeProperties может иметь значения, которые принадлежат различным режимам выбора, например: «один выбор», «множественный выбор» и «ввод строки / целого числа / десятичного числа»

Я не уверен, как спроектировать такую ​​объектную модель домена. Особенно, как применить значения свойств ProductType к объекту Product.

В настоящее время я не против сохранности, только в отношении модели предметной области, поскольку я могу свободно выбирать базу данных 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» и «наследовать» свойства и доступные значения от каждого из связанных видов продукции.

Я никогда не делал подобную объектную модель, поэтому очень интересно, как это сделать правильно. Спасибо за любые идеи и предложения.

1 Ответ

2 голосов
/ 29 августа 2011

Вы можете отобразить 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 - это другой тип, представляющий, например, список строк.

...