如何在不使用存储库的情况下共享EntityFramework 6数据上下文

本文关键字:共享 情况下 EntityFramework 上下文 数据 存储 | 更新日期: 2023-09-27 18:08:02

由于EF6现在是完全可模拟的,并且我们有内置的工作单元和存储库-我想从存储库模式中移开。

然而,如何在应用程序中共享单个数据上下文呢?我是否应该有一个在构造函数中接受数据上下文的基本服务?
public class BaseService<T>:where T:class
{
   public BaseService(DataContext myDataContext)
   {
   //....... code
   }
}

,然后有派生的服务,如PersonService, OrderService和其他使用数据上下文查询,更新和保存数据?

还是有更好的方法?

谢谢

如何在不使用存储库的情况下共享EntityFramework 6数据上下文

然而,如何在应用程序中共享单个数据上下文呢?我是否应该有一个在构造函数中接受数据上下文的基本服务?
像大多数事情一样,这要视情况而定。你的设计有多复杂?您是否在应用领域驱动设计?代码优先还是数据库优先?

一般来说,你提出的解决方案是好的。当您的项目变得更加复杂时,您可能会采用BoundedContexts作为应用领域驱动设计的一部分。因此,只有一个上下文是某个'BaseService'的一部分可能不再有意义。

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

任何成熟的IoC容器都应该能够支持这一点。下面是Autofac的一行代码。

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

特别是在数据库优先实现中,我更喜欢用接口支持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模型的例子