Методы для контакта с анемичной моделью предметной области

Для всех, кто задается вопросом: проблема в том, что он использовал GET в своем коде в какой-то момент, но он исправил это сейчас, и он работает. Пожалуйста, смотрите комментарии к его вопросу для получения дополнительной информации. Некоторые общие замечания после того, как я увидел вопросы и предложенные ответы:

  1. Общую информацию о маршрутах Laravel можно получить из документов: https://laravel.com/docs/5.7/ маршрутизация (убедитесь, что вы используете одну версию, соответствующую вашей версии laravel)
  2. API-маршруты, определенные в api.php, всегда автоматически добавляют api /, поэтому нет необходимости специально вводить их в файлах маршрутов [ 115]
  3. Ведущие / в маршрутах не нужны Route::get("api/test", function(){}); можно получить по /api/test.
  4. Однако попытка доступа к нему с помощью /api/test/ приводит к исключению MethodNotAllowedException, поскольку Laravel предполагает, что после / что-то следует в качестве параметра get. Так что будьте осторожны:)

20
задан Matt Kocaj 18 July 2017 в 08:21
поделиться

4 ответа

Martin Fowler записал много о моделях предметной области, включая анемичные модели предметной области . У него также есть краткие описания (и диаграммы классов UML) многих шаблонов разработки для моделей предметной области и баз данных, которые могли бы быть полезными: Каталог "Шаблонов Архитектуры приложений для предприятия" .

я предложил бы смотреть Активная Запись и Картопостроитель Данных шаблоны. Из описания Вашей проблемы это кажется, что Ваши классы помощника содержат и домен/бизнес-правила и детали реализации базы данных.

Активная Запись переместила бы доменную логику помощника и код базы данных в другие объекты области (как Ваш Entity базовый класс). Картопостроитель Данных переместил бы доменную логику помощника в объекты области и код базы данных в отдельный объект карты. Любой подход был бы более объектно-ориентирован, чем классы помощника процедурного стиля.

"Доменный Управляемый Дизайн Eric Evans" книга превосходен. Это становится немного сухим, но определенно стоит того. InfoQ имеет "Доменный Управляемый Дизайн Быстро" мини-книга , которая является хорошим введением в книгу Evans. Плюс "Доменный Управляемый Дизайн Быстро" доступно как свободный PDF.

7
ответ дан 30 November 2019 в 00:59
поделиться

Я всегда думал об анемичной модели предметной области как об анти-шаблоне. Ясно, что клиент купит продукты, что способность может быть generised интерфейсной реализацией

Interface IPurchase
      Purchase(Product);

, таким образом, любой из Ваших объектов области может тогда реализовать это как требуется. Таким образом можно представить функциональность объектам области - который является точно, где это должно быть.

2
ответ дан 30 November 2019 в 00:59
поделиться

Чтобы избежать анемичной модели, выполните рефакторинг вспомогательных классов:

Логика вида:
«Customer.PurchaseProduct (Продукт продукта, Платежный платеж)»,
«Customer.KillCustomer (Убийца людей, огнестрельное оружие)»
должен существовать прямо в доменном объекте «Клиент».

Логика типа:
"Customer.IsCustomerAlive ()"
«Customer.IsCustomerHappy ()»
должен перейти к спецификациям.

Логика вида:
"Customer.Create ()",
«Customer.Update ()»
очевидно, следует перейти в репозитории.

Логика типа:
«Customer.SerializeInXml ()»
«Customer.GetSerializedCustomerSizeInBytes ()»
должны идти в службы.

Сложные конструкторы должны идти на фабрики.

Вот как я это вижу. Я был бы рад, если бы кто-нибудь прокомментировал мое понимание подхода DDD.


Изменить:

Иногда - анемичной модели домена не следует избегать .

Отредактировал свой ответ, чтобы добавить, что DDD не Не о том, чтобы собирать и опускать узоры.
DDD - это то, как мы думаем.

15
ответ дан 30 November 2019 в 00:59
поделиться

One approach that you haven't mentioned is using AOP to handle your data access. An example of my recent use of this approach (though vastly simplified for posting purposes) was that I had an Account domain entity which had a debit method, encapsulating the business logic required in order to make a successful debit from the account.

N.B. All code is Java with AspectJ AOP notation...

public boolean debit(int amount) {
    if (balance - amount >= 0) {
        balance = balance - amount;
        return true;
    }
    return false;
}

With the appropriate repository injected into my aspect, I then used a pointcut to intercept calls to this method...

pointcut debit(Account account,int amount) :
    execution(boolean Account.debit(int)) &&
    args(amount) &&
    target(account);

...and applied some advice:

after(Account account, int amount) returning (boolean result)  : debit(account,amount) {
    if (result) getAccountRepository().debit(account, amount);
}

In my opinion this gives a nice separation of concerns, and allows your domain entities to focus entirely on the business logic of your application.

0
ответ дан 30 November 2019 в 00:59
поделиться
Другие вопросы по тегам:

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