Frühling und das anämische Domänenmodell

Daher ist mir aufgefallen, dass ich meine Spring / Hibernate-Stapelobjekte definitiv so strukturieren möchte:

Foo Controller ruft "FooService" anFooService ruft die Methode FooRepository.getById () auf, um einige Foos abzurufen.FooRepository führt einige Ruhezustandsaufrufe aus, um Foo-Objekte zu laden.FooService macht einige Interaktionen mit den Foos. Es kann einen verwandten TransactionalFooService verwenden, um Dinge zu handhaben, die in einer Transaktion gemeinsam erledigt werden müssen.FooService fordert FooRepository auf, die Foos zu speichern.

Das Problem dabei ist, dass die Foos keine wirkliche Logik haben. Wenn beispielsweise jedes Mal, wenn ein Foo abläuft, eine E-Mail gesendet werden muss, wird Foo.expire () nicht aufgerufen. Es wird FooService.expireFoo (fooId) aufgerufen. Dies hat verschiedene Gründe:

Es ist ärgerlich, andere Dienste und Gegenstände von einem Foo zu bekommen. Es ist keine Frühlingsbohne, und sie wurde von Hibernate geladen.Es ist ärgerlich, ein Foo dazu zu bringen, mehrere Transaktionen durchzuführen.Es ist schwer zu entscheiden, ob Foo dafür verantwortlich sein soll, wann er sich selbst retten soll. Wenn Sie foo.setName () aufrufen, sollte foo die Änderung beibehalten? Sollte es warten, bis Sie foo.save () aufrufen? Sollte foo.save () einfach FooRepository.save (this) aufrufen?

Aus diesen Gründen sind meine Spring-Domänenobjekte im Allgemeinen verherrlichte Strukturen mit einer gewissen Validierungslogik. Vielleicht ist das okay. Möglicherweise sind Webdienste als Verfahrenscode in Ordnung. Wenn neue Funktionen geschrieben werden, ist es möglicherweise akzeptabel, neue Dienste zu erstellen, die auf neue Weise mit denselben alten Objekten umgehen.

Aber ich möchte mich dieser Art von Design entziehen, und ich frage mich, was andere Spring-Anwendungen dagegen tun. Bekämpfst du es mit ausgefallenen Tricks wie dem Weben in der Ladezeit (mit denen ich mich nicht so wohl fühle)? Hast du einen anderen Trick? Denken Sie, dass das Verfahren in Ordnung ist?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage