ORM/DAL として EF (5.0 Beta Code First) を使用する場合の新しいプロジェクトのベスト プラクティスを調査しています。重要な考慮事項は、テスト容易性、疎結合設計、リポジトリ全体の作業単位/トランザクション サポートです。
EF 内では DbContext は UoW であり、DbSet はリポジトリであり、サービス レイヤーでは、DbContexts SaveChanges() メソッドによって調整された複数のリポジトリ間で変更を加えることができることを理解しています。これが私のサンプル構成です:
public interface IMyContext
{
IDbSet<Foo> Foos{ get; }
IDbSet<Bar> Bars { get; }
int SaveChanges();
void Dispose();
}
public class EFMyContext : DbContext, IMyContext
{
private IDbSet<Foo> _foos;
private IDbSet<Bar> _bars;
public EFMyContext()
: base("name=MyConnectionString")
{
Database.SetInitializer<EFMyContext>(null);
}
public IDbSet<Foo> Foos
{
get
{
if (_foos == null)
{
_foos = this.Set<Foo>();
}
return _foos;
}
}
public IDbSet<Bar> Bars
{
get
{
if (_bars == null)
{
_bars = this.Set<Bar>();
}
return _bars;
}
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new FooConfiguration());
modelBuilder.Configurations.Add(new BarConfiguration());
base.OnModelCreating(modelBuilder);
}
これまでのところすべて順調です。これを使いたい場合は、このような上位層です
public class MyService : IMyService
{
private IMyContext _context;
public MyService(IMyContext context)
{
_context = context;
}
public void DoSomethingWithMyContext()
{
// fancy implementation code
}
}
MyContext は IDBSet 型のプロパティを公開するため、EntityFramework.dll に直接依存しているため、ここで問題が発生します。これは正しくないようで、この質問に非常に似ています。
私の質問は、EF への直接的な依存関係を抽象化する方法ですか? ライブ コンテキストを渡すために独自のリポジトリと作業単位を導入することを考えましたが、これは変更追跡や他のすべての優れた EF 機能にどのような影響を与えるでしょうか?
私が注目しているのは、コンテキストのライフサイクルを管理するための IoC メカニズムです。その時点で UoW を廃止することはできますか?
あいまいで申し訳ありませんが、私はこれで研究が飽和状態にあり、実装の前に開始する決定的な場所が必要です.