当使用 EF(5.0 Beta Code First)作为我的 ORM/DAL 时,我一直在研究新项目的最佳实践。关键考虑因素是可测试性、松散耦合设计和跨存储库的工作单元/事务支持。
我知道在 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
}
}
在这里我遇到了问题,因为我直接依赖于 EntityFramework.dll,因为 MyContext 公开了 IDBSet 类型的属性。这似乎不对,与这个问题非常相似。
所以我的问题是,如何抽象出对 EF 的直接依赖?我考虑过引入我自己的存储库和工作单元来传递实时上下文,但这将如何影响更改跟踪和所有其他简洁的 EF 功能?
我正在研究的另一件事是管理上下文生命周期的 IoC 机制。那时我可以取消 UoW 吗?
抱歉含糊不清,我正处于研究饱和点,需要一个明确的起点才能开始实施。