DDD Service или Entity для моделирования уменьшения суммы подарочной карты - PullRequest
2 голосов
/ 21 декабря 2011

Предисловие: только начинаю изучать DDD.

Я пытаюсь представить пример подарочной карты, которую я мог бы смоделировать с использованием DDD. Скажем, например, у меня есть сущность подарочной карты. В моей системе в какой-то момент сумма подарочной карты должна быть уменьшена или погашена. Буду ли я использовать объект обслуживания подарочной карты, чтобы уменьшить сумму? Услуга будет включать в себя проверку входящей суммы и убедитесь, что новая сумма не превышает баланс, т. Д. Или это будет действовать прямо на моем объекте подарочной карты как другой метод, а затем просто передать мой обновленный объект подарочной карты в мой репозиторий для сохранения?

public GiftCard
{
     public int Id { get; set; }
     public double Amount { get; set; }
}

public GifTCardService
{
     public void ReduceAmount(GiftCard card, double amount)
     {
         // Validation checks to make sure amount can be removed.
         // Call gift card repository to actually remove amount.
     }
}

Ответы [ 3 ]

2 голосов
/ 21 декабря 2011

Для начала вы, вероятно, хотите, чтобы свойства были доступны только для чтения. Таким образом, Id и Amount не могут быть изменены только путем установки значения.

Далее вам потребуется способ размещения транзакций по подарочной карте. Эти транзакции будут корректировать сумму дебетования соответственно. Примерно так:

class GiftCard
{
    public long Id {get; private set;}
    public double Amount {get; private set;}

    public void Apply(Transaction tx)
    {
         if(tx.Amount > Amount)
         {
            handle insufficient funds
         }
         else
         {
            Amount -= tx.Amount;
            //other logic if necessary
         }
    }
}

Имейте в виду, что это только один из многих вариантов дизайна.

2 голосов
/ 21 декабря 2011

Поведение должно быть на объекте.Кроме того, Идентификатор и Сумма должны быть частными членами с публичным доступом.Так это будет выглядеть так:

public GiftCard 
{ 
     private int _id;
     private double _amount;

     public int Id 
     { 
         get { return _id; } 
         set { _id = value; }
     } 

     public double Amount 
     { 
         get { return _amount; }
         set { _amount = value; } 
     } 

     public void ReduceAmount(double amount) 
     {
         // Validation checks to make sure amount can be removed. 
         ...

         //Reduce amount.
         _amount -= amount;
     }
} 
2 голосов
/ 21 декабря 2011

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

set user to registered, and send email using some sort of email sending service

в этом случае у меня будет служба регистрации пользователей.

В вашей ситуации, однако, будет намного проще, если у вас достаточно умный доменный объект для проверки правильности установки его собственных свойств.

Опять же, я просто смотрю на это.

надеюсь, это поможет

...