2015-02-19 2 views
1

Итак, я строю систему управления контактами. Моя модель контактного домена имеет довольно много свойств строки, а также логические значения. В духе сохранения поведения внутри моделей домена я пошел по пути создания «методов обновления». Я начинаю чувствовать, что это становится немного обременительным. Раньше CRUD-приложения имели бы только один метод обновления, и он установил бы все свойства за один снимок.DDD Метод обслуживания Гранулярность

Есть ли я на правильном пути? Меня беспокоит наличие 10-15 методов обновления для моих доменных служб и доменных объектов.

FYI, приведенный пример немного надуман, поэтому представьте себе модель с большим количеством строковых и булевых свойств.

// Application Layer Stuff 
public class UpdateContactCommand 
{ 
     public UpdateNamePredicate UpdateName { get; set; } 
     public UpdatePhonePredicate UpdatePhone { get; set; } 
     public int ContactId { get; set; } 
} 

public class UpdateNamePredicate 
{ 
     public string NewFirstName { get; set; } 
     public string NewLastName { get; set; } 
} 
public class UpdatePhonePredicate 
{ 
     public string NewPHone { get; set; } 

} 

public class UpdateContactResponse 
{ 
     public bool Success { get; set; } 
     public string Message { get; set; } 
} 

public interface IWcfService 
{ 
     UpdateContactResponse UpdateContact(UpdateContactCommand updateContactCommand); 
} 

public class WcfService : IWcfService 
{ 
     private readonly IContactService _contactService; 

     public WcfService(IContactService contactService) 
     { 
      _contactService = contactService; 
     } 

     public UpdateContactResponse UpdateContact(UpdateContactCommand updateContactCommand) 
     { 
      if (updateContactCommand.UpdateName != null) 
      { 
       _contactService.UpdateName(updateContactCommand.ContactId, updateContactCommand.UpdateName.NewFirstName, 
        updateContactCommand.UpdateName.NewLastName); 
      } 

      if (updateContactCommand.UpdatePhone != null) 
      { 
       _contactService.UpdatePhone(updateContactCommand.ContactId, updateContactCommand.UpdatePhone.NewPHone); 
      } 

      return new UpdateContactResponse(); 
     } 
} 



// Domain Layer 
public interface IContactService 
{ 
     // There are lots more of these 
     void UpdateName(int contactId, string newFirstName, string newLastName); 
     void UpdatePhone(int contactId, string newPhone); 
} 


public class ContactService : IContactService 
{ 
     private readonly IContactRepository _contactRepository; 

     public ContactService(IContactRepository contactRepository) 
     { 
      _contactRepository = contactRepository; 
     } 

     public void UpdateName(int contactId, string newFirstName, string newLastName) 
     { 
      var contact = _contactRepository.GetById(contactId); 

      contact.SetName(newFirstName, newLastName); 

      _contactRepository.Commit(); 
     } 

     public void UpdatePhone(int contactId, string newPhone) 
     { 
      var contact = _contactRepository.GetById(contactId); 

      contact.SetPhone(newPhone); 

      _contactRepository.Commit(); 
     } 
} 

public interface IContact 
{ 
     int Id { get; set; } 

    // There are lots more of these 
     void SetName(string newFirstName, string newLastName); 
     void SetPhone(string newPhone); 
} 

public class Contact : IContact 
{ 
     public int Id { get; set; } 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
     public string Phone { get; set; } 
     public void SetName(string newFirstName, string newLastName) 
     { 
      FirstName = newFirstName; 
      LastName = newLastName; 
     } 

     public void SetPhone(string newPhone) 
     { 
      Phone = newPhone; 
     } 
} 

public interface IContactRepository 
{ 
     IContact GetById(int id); 
     void Commit(); 
} 

public class ContactRepository : IContactRepository 
{ 
     public IContact GetById(int id) 
     { 
      // Not important 
      throw new NotImplementedException(); 
     } 

     public void Commit() 
     { 
      // Not important 
      throw new NotImplementedException(); 
     } 
} 

ответ

1

Прежде всего, не все приложения хорошо подходят для подхода DDD. Если вы скажете, что ваше приложение может быть реализовано в CRUDish раньше, скорее всего, это все еще CRUD. Не пытайтесь применять DDD в любом приложении, потому что это блестящая новая вещь.

Это, как говорится, вы не просто пишете «методы обновления» для удовольствия. Они должны отражать домен tasks, который ваш пользователь хочет выполнить. Почему пользователь хочет обновить контакт? Был ли контакт перемещен или только что был изменен номер телефона? Изменено семейное положение и имя? Была ли связь с кем-то в компании другим сотрудником?

Обычно у вас не будет тонны методов обновления для данного объекта. Всегда есть способ группировать изменения в операциях, которые имеют смысл для домена. Хорошие способы заставить себя сделать это:

  • Подумайте о максимальном количестве полей формы, которые вы можете разумно отобразить пользователю. Разве вы не могли бы разбить этот сложный интерфейс на более мелкие, более значимые экраны? Оттуда вы должны начать рассуждать (желательно с помощью эксперта домена) о задачах, которые они должны отразить.

  • your entity fieldsimmutable снаружи. Таким образом, вам придется больше думать об их истинном характере - что должно быть в конструкторе? какими должны быть некоторые другие методы манипуляции?

Смежные вопросы