私はEntityFramework、WCF、および WPF に基づく新しい 3 層アプリケーションの私のチームの開発を支援するために、Dependency Injection ( Mark Seemann: .NETでの依存性注入およびさまざまな記事) を読んでいます。
サービス ( DAL <-> WCF <-> BL <-> WCF <-> PL / UI )を介して通信するため、各層にコンポジション ルートが必要であると想定しています。
私たちの要件の 1 つは、アプリケーションのデプロイ後にモデルを変更/拡張できるように、EF を動的にロードして構成する必要があることです。
BL --> PL/UI 実装の詳細には触れずに、カスタム serviceHost の背後にある EntityService を介して公開される DAL に注目しましょう。簡単な例を使用したプロジェクトは、次のようにレイアウトされています。
Project.DataModel
- 単一のアセンブリ
- ハード参照: なし
- ランタイム解像度: なし
- 抽象クラスとデータ モデリング用のインターフェイスを提供する共通ライブラリ。つまり、EntityData 抽象クラス
Project.DataModel.[?]データ
- 多くのアセンブリ: CityData、CustomerData など
- ハード参照: Project.DataModel
- ランタイム解像度: なし
- EntityData に基づく単一または複数のエンティティを定義するコンポーネント
Project.DataModel.[?]DataConfiguration
- 多くのアセンブリ: つまり、CityDataConfiguration、CustomerDataConfiguration など
- ハード参照: Project.DataModel.[?]Data、EntityFramework
- ランタイム解像度: なし
- 前のアセンブリで定義されたエンティティの EntityTypeConfiguration を定義するコンポーネント。
Project.DataAccess
- 単一のアセンブリ
- ハード参照: Project.DataModel、EntityFramework
- 実行時の解決: Project.DataModel.[?]Data、Project.DataModel.[?]DataConfiguration
- EntityManager(abstraction) を介して DbContext を提供するデータ アクセス ライブラリ。実行時に、このアセンブリは構成またはディレクトリを参照し、EntityTypes とそれに相当する EntityTypeConfigurations を読み込み、モデルを動的に作成します。
Project.ServiceModel.EntityDataService
- 単一のアセンブリ
- ハード参照: Project.DataModel、Project.DataAccess
- ランタイム解像度: なし
- EntityManager クラスを介して EntityData オブジェクトに対する CRUD 操作を提供する汎用サービス。
Project.ServiceModel.EntityDataServiceContract
- 単一のアセンブリ
- ハード参照参照: Project.DataModel
- ランタイムの解決: Project.DataModel.[?]Data
- サービス コントラクトを公開し、ServiceKnownTypes を定義する必要があるため、EntityTypes のランタイム解決が必要です。
Project.ServiceHost
- 単一のアセンブリ
- ハード参照: なし
- 実行時の解決: Project.ServiceModel.[?]Service、Project.ServiceModel.[?]ServiceContract
- EntityDataService などのさまざまなサービスを (構成またはディレクトリのスキャンを通じて) 実行時に解決して読み込むカスタム ServiceHost。
これは、コンパイル時にあまり知らず、アセンブリ間のハード参照があまりないプラグイン プロジェクトのように感じます。
このシナリオで DI をどのように実装しますか。DI や DI コンテナ、コンポジション ルート、ロットをどのように、どこで使用するかについて、私は本当に指を置くことができません。
ご意見をお待ちしております。