如何在Web Api中处理DbContext?

时间:2014-11-25 08:11:02

标签: c# entity-framework asp.net-web-api autofac

我的控制器使用DI参考我的服务。控制器不了解EF或其DbContext。甚至服务也不了解EF或DbContext,因为它们引用UoW(也通过DI):

public class CustomerController : ApiController
{
    private readonly ICustomerService customerService;

    public CustomerController(ILogService logService,
                              ICustomerService customerService)
    {
        this.customerService = customerService;
    }
}

public CustomerService(ILogService logService, IUnitOfWork unitOfWork) {}

UoW显然引用了DbContext:

public interface IUnitOfWork : IDisposable { }

public class UnitOfWork : IUnitOfWork
{
    private DbContext context;
}

问题:

  1. UoW是否应该实施IDisposable,以便在UoW超出范围后处理上下文?

  2. 服务是否应该实施IDisposable来处置UoW?

  3. 或者处理由Autofac(我的DI)处理的UoW和服务?

1 个答案:

答案 0 :(得分:0)

您总是需要自行清洁,以便从垃圾收集器(GC)中卸下负载并避免GC为您进行清洁,因为它价格昂贵且需要额外的时间/资源。

所以,如果你的对象持有一个资源而你的对象在对象本身超出范围或被处置时没有处置该资源,那么这是一个内存泄漏,除非其他人将跟踪该资源和处理它。

现在,根据你注册服务的生命周期,Uow和上下文,DI可以为你的对象调用dispose方法,这意味着你的对象需要实现IDisposable。

我会在每个中实现IDisposable,并确保我注册了作为根对象的服务,我会将其注册到"实例每个生命周期范围"这将为每个http请求创建一个实例,并在http请求结束时调用service.dispose方法,但是,如果您使用" Instance Per Dependency"那么你负责处理实例,这意味着你需要覆盖ApiController dispose方法并启动从服务到上下文的dispose循环。

希望有所帮助。