如何在不使用存储库的情况下共享Entity Framework 6 dbcontext?

时间:2014-06-09 20:01:39

标签: c# entity-framework

由于EF6现在完全可以模拟,我们已经内置了工作单元和存储库 - 我想远离存储库模式。

但是,如何在应用程序中共享单个数据上下文。我应该有一个基本服务,在其构造函数中采用datacontext吗?

public class BaseService<T>:where T:class
{
   public BaseService(DataContext myDataContext)
   {
   //....... code
   }
}

然后使用datacontext查询,更新和保存数据等派生服务,如PersonService,OrderService和其他服务?

或者有更好的方法吗?

由于

1 个答案:

答案 0 :(得分:1)

  

但是,如何在应用程序中共享单个数据上下文。我是否应该在其构造函数中使用datacontext的基本服务?

与大多数事情一样,这取决于。你的设计有多复杂?您是否正在应用域驱动设计?代码优先或Db优先?

通常,您提出的解决方案很好。随着项目变得越来越复杂,您可以采用BoundedContexts作为应用域驱动设计的一部分。因此,只有一个上下文属于某些&#39; BaseService&#39;可能已经没有意义了。

JotaBe提到依赖注入和上下文的生命周期,这很重要。你在使用依赖注入吗?我更喜欢让我的IoC容器关注上下文的生命周期。 例如,对于Web应用程序,我将生命周期绑定到每个Web请求。

任何成熟的IoC容器都应该能够支持这一点。这是Autofac的快速单行。

builder.RegisterType<MyDbContext>().As<IMyDbContext>().InstancePerApiRequest();

特别是对于Db-first实现,我更喜欢使用接口支持DbContext,并使用接口来控制向调用者公开的内容。

public interface IMyDbContext {
    //Only expose people, not orders for example
    DbSet<Person> People { get; set; }
}

public partial class MyDbContext : IMyDbContext {
    //the generated DbContext class satisfies the interface
}

public class PersonService {

    private readonly IMyDbContext _context;

    public PersonService(IMyDbContext context){
        _context = context;
    }
}

我发现开销很小,有助于将上下文的范围扩展到您感兴趣的实际对象,而不是创建多个EDMX文件。当您的域变得复杂时,可以帮助您进入BoundedContexts。

这是关于有界情境和缩小EF模型的另一个example