Организации DDD, использующие Услуги

Если ваша цель - использовать помощник ActionLink и открыть новую вкладку:

@Html.ActionLink("New tab please", "Home", null , new { target = "_blank" })

@Html.ActionLink("New tab please", "Home", Nothing, New With {Key .target = "_blank"})
11
задан Craig Vermeer 4 March 2010 в 19:20
поделиться

5 ответов

Примите вашу службу объект Ticket в качестве параметра. Службы не должны иметь состояния, и одна и та же служба должна иметь возможность предоставлять свои услуги любому количеству объектов.

В вашей ситуации я бы вытащил FinancialCalculatorService и RateCalculatorService из вашей сущности и заставил бы методы каждой службы принимать сущность Ticket в качестве параметра.

Найдите секунду и прочтите стр. 105 из Доменно-ориентированный дизайн Эрика Эванса

7
ответ дан 3 December 2019 в 08:03
поделиться

Учитывая то, что мы видели о классах, я не думаю, что они на самом деле службы в синем цвете Книжный смысл , а калькуляторы я бы держал в Билете .

Ни FinancialCalculatorService , ни RateCalculationService не зависят от объектов домена - они оба работают с примитивными значениями. Приложениям не нужно беспокоиться о том, как рассчитать финансовую выгоду, которая может быть получена от билета, поэтому полезно инкапсулировать эту информацию внутри самого билета.

Если у них действительно нет зависимостей от сущностей предметной области, подумайте о них как о «автономных классах», а не о «сервисах» (опять же, в терминологии синей книги).Это, безусловно, подходит для Ticket , зависящих от объектов стратегии ( FinancialCalculator и RateCalculator ), которые сами по себе не имеют экзотических зависимостей и сами не изменяют состояние объектов домена.

Обновление для Edit 2 . Я думаю, что одним из преимуществ отдельных классов калькуляторов является то, что вы можете тестировать их независимо от Ticket . Строго говоря, билеты не несут ответственности за выполнение этих вычислений, они несут ответственность за правильные вызовы этих сотрудничающих классов. Поэтому я был бы склонен сделать их способными к инъекции / имитацией, как в вашем первоначальном примере.

3
ответ дан 3 December 2019 в 08:03
поделиться

Я бы сказал, что службы используют сущности, а не наоборот.

еще кое-что, не уверен в вашем домене, но вы уверены, что билет является сущностью, а не объектом значения?

2
ответ дан 3 December 2019 в 08:03
поделиться

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

Лично я не заставляю моих сущностей использовать сервисы, так как это создает массу работы вокруг вопроса «Как мне аккуратно добавить сервисы в мои сущности?» вопрос.

Мне кажется, что CalculateFinancialGains () - это скорее вызов уровня обслуживания. Это действительно приводит к сильной анемии у Ticket, но я предполагаю, что у него другое поведение? А если нет, то, вероятно, запах ...

2
ответ дан 3 December 2019 в 08:03
поделиться

Этот вопрос на самом деле является примером обсуждение, которое есть в книге «Чистый код» (стр 96-97). Основной вопрос заключается в том, следует ли использовать процедурный подход или объектно-ориентированный подход. Надеюсь, я не нарушаю, повторяя здесь пару частей, но вот то, что Боб Мартин указывает в качестве руководства:

Процедурный код (код, использующий структуры данных) упрощает добавление новых функций без изменения существующих структур данных. С другой стороны, объектно-ориентированный код упрощает добавление новых классов без изменения существующих функций.

Этот комплимент также верен:

Процедурный код затрудняет добавление новых структур данных, потому что все функции должны изменяться. ОО-код затрудняет добавление новых функций, потому что все классы должны измениться.

Насколько я понимаю, DDD «Тип значения» будет тем, что Боб Мартин называет структурой данных.

Надеюсь, это поможет, а не только усилит шум :)

1
ответ дан 3 December 2019 в 08:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: