現在、データアクセス戦略としてEntity Framework 5(.net 4)を使用しているn層ソリューションを設計していますが、依存性注入を組み込んでテスト可能/柔軟にする方法を検討しています。
私の現在のソリューションレイアウトは次のとおりです(私のソリューションはAlcatrazと呼ばれます)。
Alcatraz.WebUI:asp.net webformプロジェクト、フロントエンドユーザーインターフェイスは、プロジェクトAlcatraz.BusinessおよびAlcatraz.Data.Modelsを参照します。
Alcatraz.Business:クラスライブラリプロジェクト。ビジネスロジックを含み、プロジェクトAlcatraz.Data.Access、Alcatraz.Data.Modelsを参照します。
Alcatraz.Data.Access:クラスライブラリプロジェクトは、AlcatrazModel.edmxとAlcatrazEntities
DbContextを収容し、プロジェクトAlcatraz.Data.Modelsを参照します。
Alcatraz.Data.Models:クラスライブラリプロジェクト。AlcatrazモデルのPOCOを含み、参照はありません。
このソリューションがどのように機能するかについての私のビジョンは、web-uiがビジネスライブラリ内のリポジトリをインスタンス化することです。このリポジトリは(コンストラクタを介して)接続文字列(AlcatrazEntities
インスタンスではなく)の依存関係を持ちます。web-uiはデータベース接続文字列を知っていますが、それがエンティティフレームワーク接続文字列であることはわかりません。
ビジネスプロジェクトで:
public class InmateRepository : IInmateRepository
{
private string _connectionString;
public InmateRepository(string connectionString)
{
if (connectionString == null)
{
throw new ArgumentNullException("connectionString");
}
EntityConnectionStringBuilder connectionBuilder = new EntityConnectionStringBuilder();
connectionBuilder.Metadata = "res://*/AlcatrazModel.csdl|res://*/AlcatrazModel.ssdl|res://*/AlcatrazModel.msl";
connectionBuilder.Provider = "System.Data.SqlClient";
connectionBuilder.ProviderConnectionString = connectionString;
_connectionString = connectionBuilder.ToString();
}
public IQueryable<Inmate> GetAllInmates()
{
AlcatrazEntities ents = new AlcatrazEntities(_connectionString);
return ents.Inmates;
}
}
Web UIの場合:
IInmateRepository inmateRepo = new InmateRepository(@"data source=MATTHEW-PC\SQLEXPRESS;initial catalog=Alcatraz;integrated security=True;");
List<Inmate> deathRowInmates = inmateRepo.GetAllInmates().Where(i => i.OnDeathRow).ToList();
この設計に関するいくつかの関連する質問があります。
この設計は、Entity Frameworksの機能の観点からも理にかなっていますか?Entityフレームワークはすでに作業単位パターンを使用していると聞きましたが、抽象のレイヤーを不必要に追加しているだけですか?
私のWeb UIがEntity Frameworkと直接通信することを望まない(または、そのことを参照することさえ) (Webサービス、Windowsアプリケーションなど)、ビジネスロジックを1つの中央領域に配置することで、メンテナンスや更新を簡単に行えるようにしたいと考えています。これはこれを達成する適切な方法ですか?
ビジネスレイヤーにリポジトリを含める必要がありますか、それともアクセスレイヤーに含める必要がありますか?どこに問題がなければ、接続文字列を渡すのは良い依存関係でしょうか?
読んでくれてありがとう!
DbContext
依存関係としてaを受け入れます。ビジネスクラスには、依存関係としてリポジトリがあります。依存性注入では、これを手動で実行しています(そのため、何が起こっているのか理解できます)。接続文字列を設定できるようにしたい理由は、DbContext
データベースシャーディングを使用しているため、特定のケースでは(同じ構造の)異なるデータベースに接続するためのエンティティフレームワークが必要だからです。あなたを正しく理解していますか?