У меня есть объект под названием StyleBundle.
public class StyleBundle
{
public StylePricingType StylePricingType { get; private set;}
public decimal Price {get; private set;}
public IEnumerable<Style> Styles { get; set;}
public DateTime StartDate {get; private set;}
public TimeSpan Duration {get; private set;}
public bool IsTransient {get; set;}
public void ChangeStylePricingType(StylePricingType newStylePricingType)
{
this.StylePricingType = newStylePricingType;
}
}
Этот объект StyleBundle имеет свойство StylePricingType.StylePricingType - это перечисление двух типов:
PerStyle
Unlimited
StylePricingType влияет на общую цену StyleBundle.Это повлияет на цену, изменив стили, сохраненные в списке стилей.Unlimited StyleBundle будет автоматически включать все доступные стили, но PerStyle StyleBundle позволит пользователю вручную выбирать, какие стили они хотят включить.
Теперь мне нужно разрешить изменение StylePricingType, если StyleBundle является переходным (В предыдущих правилах говорилось, что после того, как StyleBundle будет создан новым, вы не сможете изменить StylePricingType).
НО, чтобы внести это изменение, мне нужно выполнить проверку базы данных через репозиторий / спецификацию/ service ... иначе, но я хочу это сделать.
Проверка в основном ищет любые другие StyleBundles в течение той же продолжительности текущего StyleBundle, и проверяет, нет ли наложения в Styles в StyleBundle.
Поскольку изменение этого свойства для переходного StyleBundle требует проверки с другими сохраняемыми StyleBundles, каков наилучший способ реализации этого?
Использовать инъекцию в конструктор: инжектироватьсервис в конструкцию объекта StyleBundleт е р.Мне это не нравится, потому что мне не нравится вставлять зависимости в мои сущности, если только мне это не нужно.Кроме того, поскольку мне не нравится идея внедрения зависимости в конструктор, когда она необходима только для вызова метода, который изменит StylePricingType, я вижу это как плохой дизайн.
Использование внедрения метода: поскольку мне нужен только сервис для этого вызова одного метода, кажется, это имеет больше смысла.Но в то же время мне не нравится идея, что пользователь может изменить этот тип, не зная, что он выполняет запрос БД.Кроме того, я все еще внедряю сервис в свою сущность, просто по-другому, и мне действительно не нравится внедрять что-либо в мои сущности.
Использование доменной службы: кажетсябыть самым явным из всех.Я мог бы создать класс StyleBundleService, у которого есть метод ChangeStylePricingType, который использует хранилище или спецификацию для запуска проверки, заданной StyleBundle.Таким образом, требование сделано в коде очень явным, но недостатком здесь является то, что код все еще может вызывать метод ChangeStylePricingType непосредственно в объекте StyleBundle, а BYPASS метод ChangeStylePricingType в сервисе, который мне нужно сделать.Даже если я установлю StylePricingType, чтобы получить; set;вместо частного набора;и избавившись от метода ChangeStylePricingType в StyleBundle, код все еще может вносить изменения, минуя службу домена.
Итак, все это кажется законным способом сделать что-то подобное,так каков наилучший / наиболее приемлемый способ сделать это с помощью DDD?Кроме того, возможно, мой объект StyleBundle пытается сделать слишком много, и его следует разбить на более мелкие классы / функции, которые позволили бы более красноречиво обрабатывать изменения этого требования?
Mike