テクノロジー固有のものをドメイン モデルのどこに配置するか?
-
18-09-2019 - |
質問
Active Directory にいくつかの変更 (グループへのユーザーの追加/削除、ユーザーの属性値の変更など) を行うアプリケーションがあります。
私たちは現在、それを再設計中です (「スパゲッティ コード」から、より階層的なソリューションに)。Active Directory 管理機能は、ドメイン層である程度抽象化したいものですが、同時に、ほとんどの機能はテクノロジーに大きく依存しています。
すべての Active Directory アクセス コードを DB アクセスとともにデータ アクセス レイヤーに配置する必要がありますか、それとも関数の Active Directory ライブラリを作成し、ドメイン モデルからこのライブラリを直接呼び出しても問題ありませんか?これにより、ドメイン オブジェクトが永続的に認識されるようになりますが、これはおそらく悪い考えでしょうか?
それとも、すべての Active Directory アクセスは代わりにサービス層で実行され、ドメイン層さえ関与すべきではないでしょうか?
解決
ドメインモデルは次のようにする必要があります テクノロジーに依存しない, そのため、AD コードをドメイン モデルに含めないでください。
本質的に、AD コードはデータ アクセスの単なる別の形式であると言えるため、データ アクセスに属します。 層 (ダル)。ただし、これはデータベース モジュールに属しません。これは、 単一責任の原則 (SRP - 個々のタイプだけでなくモジュールにも適用されます)。
データベース アクセスとバンドルするのではなく、独自のライブラリに実装します。概念的には、これは同じレイヤーに属しますが、実行する機能が異なるため、同じレイヤーに 2 つのライブラリがあることになります。それはまったく問題ありません。各レイヤーに必要な数のライブラリを含めることができます。
ドメイン モデルでは、AD アクセス (および DB アクセス) を抽象化として扱います。抽象的な リポジトリ がデフォルトのアプローチです。AD ライブラリには AD リポジトリの実装が含まれ、DB ライブラリには DB リポジトリの実装が含まれます。
これはよく合います ドメイン駆動設計 という概念と、 腐敗防止層.
使用できます 依存関係の注入 (DI) 具体的なリポジトリをドメイン モデルに接続します。
他のヒント
私は技術、特定の物事がドメインモデルに入れるべきではない、実装の詳細だと思います。