4

REST レイヤーによって提供されるエンティティからコア ドメイン エンティティを分離するための推奨される方法は何なのか、興味があります。

この啓発的な Spring REST チュートリアルhttp://spring.io/guides/tutorials/rest/1/で、コア ドメイン モデルはコア ドメインとは独立して進化する必要があるため、REST レイヤーで直接コア ドメイン モデルを公開しないのは良いことだとわかりました。モデル。

コア サービスは、イベントの処理と生成です。これらのイベントは、アプリケーションの通信ポートとして認識されます。コア サービスは、REST ドメイン エンティティを認識しません。また、REST コントローラーはコア ドメイン エンティティを認識しません。

簡単にするために、Order エンティティという 1 つのエンティティだけの例を考えてみましょう。

このチュートリアルでは、Order REST ドメイン クラスが REST 要求によってコントローラーに渡される方法を示します。次に、コントローラは、Order 処理イベントに渡される OrderDetails エンティティを作成して CreateOrderEvent イベントを作成します。これは、別の OrderCreatedEvent イベントを返すサービスに渡されます。コントローラーは最終的に、返されたイベントから REST ドメインの Order エンティティを作成し、それを応答で送信します。

この 1 つのエンティティに対して、コア ドメイン エンティティ用に 1 つのクラス、REST ドメイン エンティティ用に 1 つのクラス、イベント ペイロード エンティティ用に 1 つのクラスがあることがわかります。

また、アプリケーション コアにあるイベントが、HTTP メソッドを強く思い起こさせるいくつかの基本イベントに拡張されていることもわかります。私たちが最初にやろうとしているのは、アプリケーション コアを REST レイヤーから分離することであるにもかかわらず、この REST のようなものがアプリケーション コアに浸透しているのを見るのは少し驚くべきことです。

このデザインまたは別のデザインについて何か考えはありますか? このデカップリングを達成するための好ましい方法はありますか?

提案をありがとう。

敬具、

ステファン

私が今持っているもう1つの質問...

データ ドメインから切り離された REST ドメインで、エンティティの NotFoundException 例外またはイベント内の notFoundEntity イベント メンバーを使用する必要がありますか?

コントローラーに送り返されるイベントは、コントローラーで使用できる notFoundEntity メンバー状態を運ぶことができます。

イベント notFoundEntity ロジックは次のとおりです。

protected boolean notFoundEntity = false;

public boolean isNotFoundEntity() {
    return notFoundEntity;
}

public static OneAdminEvent notFound(Long id) {
    OneAdminEvent oneAdmiEvent = new OneAdminEvent(id);
    oneAdmiEvent.notFoundEntity = true;
    return oneAdmiEvent;
}

サービスは、エンティティが見つかったかどうかに応じて、イベント メンバーの状態を更新します。

Admin admin  = adminRepository.findOne(deleteAdminEvent.getId());            
if (admin == null) {
    return AdminDeletedEvent.notFound(deleteAdminEvent.getId());

コントローラーでは、エンティティが見つかったかどうかを確認する呼び出しが次のように行われます。

if (adminDeletedEvent.isNotFoundEntity()) {
}

これは、デカップリング設計と一致しています。

しかし、分離イベントがこの情報を運ぶべきかどうかはわかりません。この情報は例外、ビジネス カスタム例外として表示できます。

また、例外を使用すると、トランザクション アノテーションでロールバック属性を指定できます。

@Transactional(rollbackFor = NotFoundException.class)

例外として、見つからないエンティティ ロジックのみがサービスに残っており、イベントには何も含まれていません。

サービスは次のようになります。

Admin admin  = adminRepository.findOne(deleteAdminEvent.getId());            
if (admin == null) {
    throw new NotFoundException("No admin was found with the id " + deleteAdminEvent.getId());

イベントでメンバー状態をいつ使用するか、およびビジネス カスタム例外をいつ使用するかを決定するために使用する経験則は何ですか?

4

1 に答える 1