2015-10-27 3 views
0

Я нахожусь в поиске лучшего (или лучшего) подхода при написании доменных служб на основе доменного дизайна. Вот псевдо-кодСлужба управления доменом-приводом

public class CustomerAccount 
{ 
    public string AccountNumber {get; set;} 
    public string CustomerName {get; set;} 
    public string PhoneNumber {get; set;} 
    public string HomeAddress {get; set;} 
} 

// Domain Service Class 
public class AccountService 
{ 
    public virtual void RefreshAccount(CustomerAccount acct) 
    { 
     // Some code here to refresh the class from cache... 
     cache.refresh(acct) 
    } 
} 

public static class Cache 
{ 
    public static refresh(CustomerAccount acct) 
    { 
     // refreshing class here. 
    } 
} 

У меня есть вопрос, я должен иметь RefreshAccount() внутри AccountService и вызовите на это таким образом? Или просто вызовите класс кеша напрямую? В любом случае, отлично работает, но мой вопрос касается, с точки зрения дизайна, особенно DDD, какой путь является лучшим и почему?

Спасибо заранее!

+0

Что такое 'Cache'? Это какой-то термин в домене? Или это просто кеш, используемый для сокращения ввода-вывода по соображениям производительности? –

+0

@Jakub Yup, это еще один домен. – Kyle

+1

Обычно кеширование относится к уровню инфраструктуры, а не к доменному слою. Сама служба домена не должна ничего знать о кешировании (если кеширование действительно не является частью вашего домена), это клиент (или какая-либо промежуточная прикладная служба), которая должна консультироваться с кешем. Кроме того, если вам необходимо вырезать данные из кеша на основе какого-либо события в домене, домен должен публично публиковать это событие, а клиенты (такие как служба кеша) могут быть уведомлены и действовать соответствующим образом. – haim770

ответ

2

Cache звучит как часть уровня инфраструктуры, а не домена. Если это так, его следует удалить из уровня домена. Модель домена не должна быть загрязнена техническими сложностями.

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

В целом:

  • Если Cache и CustomerAccount являются частями одной и той же совокупности, Cache должны быть доступны из совокупного корня.
  • Если они не являются одним и тем же агрегатом, но все еще принадлежат к одному и тому же ограниченному контексту, используйте службу домена для выполнения операций, для которых требуются как CustomerAccount, так и Cache.
  • Если Cache относится к другому ограниченному контексту, используйте уведомления о событиях домена.

Я предлагаю изменить название Cache в UL, если это возможно. Это может вызвать недоразумения среди программистов в вашей команде, особенно когда к команде присоединяются новые люди.

0

DDD и Test Driven Development обычно идут рука об руку, поэтому с точки зрения TDD вы захотите сохранить ее так, как она есть, и не вызывайте метод статического обновления напрямую; в противном случае будет очень сложно правильно выполнить тестирование.

+0

Фактически, статические классы/методы считаются анти-шаблонами, поэтому, если вы хотите иметь истинную реализацию DDD, вам может потребоваться переосмыслить, как вы обновляете учетную запись. – Dan

+0

Что делать, если я вывожу «статическое» ключевое слово? будет ли это иметь значение при определении того, что нужно назвать?(т. е. из службы или метода напрямую) – Kyle

+1

@ Dan, утверждая, что 'static' классы/методы являются анти-шаблон неправильным (как вы будете определять методы расширения C# then)? Более точным утверждением было бы то, что статические классы и методы более склонны к злоупотреблениям, когда человек не понимает реальный жизненный цикл или структуру своего кода. – haim770

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