1

アカウント登録ページがあり、次のサービス クラスがあります。

  1. ユーザーサービス
  2. 役割サービス
  3. メールサービス

したがって、ユーザーが登録するときは、次のことを行う必要があります。

  1. データベースにユーザーを作成します
  2. ユーザーを特定の役割に追加する
  3. ユーザーにメールを送信する

私はSpring MVCを使用しているため、これは登録方法で行う必要があります。

さて、私の質問は、userService の登録メソッド内から他のサービスを注入/使用する必要があるかどうかです。

userService.register(....)

public class UserServiceImpl ... {

   public void register(....) {

      save(user);
      roleService.associateTo(....);
      emailService.sendRegistrationEmail(...);
   }
}

また

結合しすぎているのでしょうか。次のように、コントローラー メソッドでこれらの呼び出しを個別に行う必要があります。

public ModelAndView register(..., HttpServletRequest request, ...) {

    ..

    userService.register(user);
    roleService.associateTo(...);
    emailService.sendRegistrationEmail(...);

}

私は2番目のアプローチに傾いています。一括でユーザーを作成または登録したいとします。register を呼び出すと、一括で実行しているため、おそらくやりたくないほど多くのことが行われます (これは私が考えたものであり、おそらくそのエッジケース?)

4

2 に答える 2

3

ミックスに 3 番目のソリューションを追加します。

public class UserRegistrationService ... {

    public void register(....) {
        userService.save(user);
        roleService.associateTo(....);
        emailService.sendRegistrationEmail(...);
    }

    public void registerInBatch(...) {
        foreach(...) {
            userService.save(user);
            roleService.associateTo(....);
        }
    }
}

コントローラーでいくつかのステップを実行することは、コードを再利用するという点ではお勧めできません。REST またはその他のインターフェースを介して同じロジックを公開したい場合は、コントローラーを直接呼び出そうとするか、すべてのステップを別の場所にコピーすることになります。C&P 開発はひどいものです。次に登録プロセスにステップを追加したい場合は、すべての場所に追加する必要があります。

最終的には、最初のソリューションまたは上記で提案した私のソリューションのように、すべてのステップを単一の方法でラップするサービスを考え出すでしょう。

于 2012-05-12T20:54:52.037 に答える
2

4 番目を追加します。ユーザー登録イベントを作成し、リッスンします。

少なくともメインライン コードから電子メール送信を完全に削除し、それをキューのメッセージとして処理するか、少なくとも非同期イベントとして処理して、潜在的な遅延の問題を回避します。

(便宜上、1 回の操作でロールを持つユーザーを作成できるように、おそらくユーザーに対しても何かを行いますが、それは別の問題であり、どちらの方法でも議論の余地があります。)

于 2012-05-12T21:40:31.783 に答える