7

Я изучаю лунную архитектуру в течение нескольких дней. Я понимаю, что зависимости всегда должны идти к центру и как использовать инъекции зависимостей для достижения этого. Но у меня есть пара вопросов, которые я все еще не мог понять.Как реализовать службы и репозитории на архитектуре лука?

  1. Может ли модель (или сущность) ссылаться на интерфейс репозитория или интерфейс службы?

    Например: Order предприятие имеет DeliveryCity отношения, установленные через Oder.DeliveryZip имущество, которое не внешний ключ, но является уникальным. Для того, чтобы получить город на молнии, я должен позвонить ICityRepository.FindByZip(zip)

    У меня есть следующий код в моей модели

    class Order 
    { 
        . . . 
    
        [Inject] 
        public ICityRepository CityRepository { get; set; } 
    
        private City _dCity; 
    
        public City DeliveryCity { 
         get { 
          if (_dCity == null) 
           _dCity = this.CityRepository.FindByZip(this.DeliveryZip); 
    
          return _dCity; 
         } 
        } 
        . . . 
    } 
    
  2. Что бы проблемы в коде выше? Следует ли вместо этого использовать службу домена?

  3. Должны ли реализации служб домена быть определены внутри ядра или на уровне инфраструктуры?

ответ

5

Это место, где фабрики вписываются в домен. OrderFactory может принимать зависимости, такие как зависимость от IOrderRepository, а также зависимость от ICityRepository. Когда фабрика используется для создания (или воссоздания) объекта Ордера, фабрика может искать город и соответственно устанавливать свойство Order. Или, как предполагает herzmeister, установите его с помощью Lazy, чтобы поиск выполнялся только при необходимости.

+0

Это имеет смысл! Я спрашиваю себя: «Как я мог пропустить это?»! Благодаря! – svallory

+1

Это ошибка. Завод DDD не несет ответственности за восстановление. Реконституция - это средняя жизнь объекта, Фабрика касается только начала жизни. См. Этот ответ: http://stackoverflow.com/a/10264669/625332 – Dmitry

+0

Я не согласен. Фабрики используются для создания экземпляров объекта. Они могут быть в начале жизненного цикла объекта или использоваться для восстановления. Они могут быть одного класса с двумя методами или двумя разными классами. В любом случае, я согласен, что есть разница в том, как завод ведет себя в каждом случае. Обычно у меня есть завод по восстановлению в качестве зависимости репозитория, который делегирует фабрике создание и восстановление нового экземпляра с данными, полученными из хранилища данных. Для получения дополнительной информации см. Evans pg 145: «Восстановление сохраненных объектов» – SonOfPirate

5

Что бы проблемы в коде выше? Следует ли вместо этого использовать службу домена?

Две вещи, чтобы рассмотреть здесь:

  1. ICityRepository не реальная зависимость для заказа, другими словами заказа не нужно для ее другими методами. Реальная зависимость - это то, с чем объект не может работать без. Поэтому вы можете рассмотреть возможность передачи его в качестве параметра к методу типа «GetDeliveryCity» (см. this).

  2. Поиск города по почтовому индексу не является обязанностью заказа. Для заказа cohesive он должен иметь дело только с функциями, связанными с заказом. Вы можете использовать эту функциональность из класса заказа.

Должны реализации услуг домена определяется внутри ядра или на уровне инфраструктуры?

Внутри ядра, если это действительно сервис домена (не приложение).

0
  1. Как насчет

    private Lazy<City> _dCityLazy; 
    
    public City DeliveryCity { 
        get { 
         return _dCityLazy.Value; 
        } 
    } 
    

    где бы впрыснуть Lazy<City> по какой-то механизм?

  2. Вы бы выбрали гибко путем инъекции снаружи, а затем в этом примере.

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

+0

Внедрение города через IoC приведет к добавлению бизнес-правил к инжектору зависимости, что очень плохо. Я не уверен, что ты предложил ты. – svallory

+0

, конечно, деловые правила в инжекторе зависимости действительно плохие, но это не обязательно должно быть так. Есть много других возможностей. Между ними может находиться служба домена. Или простой просмотр id - это, очевидно, работа репозитория, несущая фактический метод, от которого будет ссылаться делегат для «Lazy ». Как правило, я просто хочу, чтобы мои объекты были простыми, то есть без каких-либо знаний о структуре фактической стойкости, то есть без каких-либо ссылок на службы или репозитории. – herzmeister

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