私は (Spring MVC フレームワークを使用して) MVC Web アプリケーションを構築していますが、特定の領域を設計する最善の方法に少し困惑しています。
アプリケーションは一連の Web サービスとやり取りする必要がありますが、これらの Web サービスはそれほど大きく設計されておらず、それ自体であまり抽象化されていません。基本的に、作成/更新/取得/削除操作ごとに Web サービス メソッドがあります。それぞれの「データ型」であり、それ以上の API はあまりありません。Web サービス クライアントは、必要なデータを作成するために、どのメソッドをどの順序で呼び出すかを知る必要があります。つまり、「トランザクション」ベースのメソッドはありません。
たとえば、単純に新しいユーザー アカウントを作成するには、合計 7 つの異なる Web サービス メソッドを呼び出して、必要なテーブルのすべてのレコードをセットアップする必要があります (user
レコード、そのユーザーへの正しいレコードの追加、privileges
ユーザーの詳細のセットアップbilling
など)。 .
これを抽象化し、アプリケーション内にカプセル化する最善の方法に苦労しています。アプリのほとんどは、標準的なフローに従います。
request ---> Controller <---> Service/Business-level object <---> DAOs for data access
アプリケーション内で、独自の「ドメイン オブジェクト」のセットを使用して、Web サービス WSDL で定義されたデータ型を表現および抽象化しているため、ドメイン ロジックは Web サービスの型に依存せず、抽象化および非表示にできます。私たちが好きな詳細。
私が意見を求めているのは、例として上で述べた「ユーザー作成プロセス」を設計するための最良の方法です。「通常のユーザー」を作成するプロセスには、前述のように 7 つの異なる Web サービスを呼び出すことが含まれますが、これはユーザーの「タイプ」の 1 つにすぎません。いくつかの異なるタイプのユーザーを作成できる必要があり、それぞれに異なる必要があります。呼び出される Web サービス。
現在、私はこの「通常のユーザー」の作成のみを、少しの概念実証としてUser
設計UserDao
しました。 7 つの Web サービス メソッドについて言及しました。メソッドは によって呼び出されます。これは私のビジネス/サービスレベル クラスであり、 によって呼び出されます。getUser(name)
createUser(User)
WebServiceUserDao
UserDao
createUser()
UserCreationService
SignupController
しかし、このロジックを拡張してさまざまなユーザー タイプを作成できるようにするには ( User.getType()
. :
- 「ユーザー タイプ」ごとに1 つの
UserDao
実装を作成して、各「ユーザー タイプ」を作成するロジックを独自のクラスにカプセル化して、UserCreationService
どちらUserDao
を使用するかを決定できるようにします。これは、1 つのサービス クラス: 多くの DAO に対応します。 UserDao
アプリケーション全体がこれらの個々のタイプのそれぞれについて知る必要はありませんが、Web サービス/DB で作成する必要がある各「レコード」に対応する小さな部分に分割する必要がありますか? そしてUserCreationService
、さまざまな異なる「ユーザータイプ」に対して異なる実装がありますか? つまり、対応するオブジェクトやドメイン オブジェクトが必要ない場合でも、この戦略には aPrivilegesDao
、 aなどがあります。これは、多くのサービス クラス: 多くの DAO になります。BillingPlanDao
Privilege
BillingPlan
- 「ユーザー タイプ」ごとに Web サービスを呼び出す必要があるすべてのロジックを単一の
WebServiceUserDao
? これには、非常に複雑なクラスを持つという欠点があります (そして、PMD は循環的複雑性についてすでに不満を持っています) が、このロジックはすべて 1 つのクラスにカプセル化され、API 全体の観点から見ると複雑さが軽減される可能性があります。
このアプリケーションでの目標の 1 つは、データの永続性の詳細を変更する必要がある場合に、DAO の実装を変更するだけで済むようにすることです。別の課金システムとのインターフェイスを開始する必要がある場合は、アプリケーションのどの部分も、DAO レベル以外で変更したくありません。
ご意見はありますか?「ビジネス ロジック」と「データ アクセス ロジック」が重複しているように見える場合、どこを分割するかを決定する際に、どのような戦略を使用しますか?