依赖注入 - 很快就会调用EF Repository Dispose方法

时间:2013-06-28 14:39:45

标签: asp.net-mvc-4 dependency-injection entity-framework-5 castle-windsor idisposable

我有一个MVC4网络项目,并使用Castle Windsor作为我的DI容器。此外,我正在使用Entity Framework来访问SQL数据库。我想将我的生活方式设置为PerWebRequest,但是,当我这样做时,我收到以下错误:“操作无法完成,因为已经处理了DbContext”。

如果我使用Transient生活方式,则会绕过错误,但它会在实体框架中引入一系列新问题。如何保持PerWebRequest生活方式,但在调用dispose方法时是否正确?

我正在使用构造函数注入来为我的存储库传递一个连接字符串来构建一个新的上下文。我还实现了IDisposable。见下文:

public class MySqlRepository : MyRepository, IDisposable
{
    private readonly DbContext _context;

    public MySqlRepository(string connectionString)
    {
        _context = new DbContext(connectionString);
    }

    protected virtual void Dispose(bool disposing)
    {
        if (disposing)
        {
            _context.Dispose();
        }
    }

    public void Dispose()
    {
        Dispose(true);
    }
}

2 个答案:

答案 0 :(得分:0)

这应该不是问题。 我曾经遇到过这个问题,原因是我的容器设置不正确。

这是一个使用城堡windsor工作的演示。

容器设置如下:

container = new WindsorContainer();
container.Register(Classes.FromThisAssembly().BasedOn<Controller>().LifestylePerWebRequest());
container.Register(Classes.FromThisAssembly().InNamespace("MvcIoCDemo.Models").WithServiceDefaultInterfaces().LifestylePerWebRequest());

控制器:

public class ProductsController : Controller
{
    private readonly IProductRepository productRepository;

    public ProductsController(IProductRepository productRepository)
    {
        if (productRepository == null) throw new ArgumentNullException("productRepository");
        this.productRepository = productRepository;
    }

存储库:

public class ProductRepository : IDisposable, IProductRepository
{
    private readonly DemoDbContext context;

    public ProductRepository()
    {
        context = new DemoDbContext();
    }

在此处查看演示项目: https://github.com/kobbikobb/MvcIoCDemo

答案 1 :(得分:0)

在更改了所有已注册的组件以使用PerWebRequest的生活方式后,我认为我的问题源于IEnumerable与Entity Framework的使用。这是一个与我非常相似的问题。 stackoverflow.com/questions/9691681/ ......我认为这是生活方式,但这可能与我与EF的互动方式有关。

我能够通过调用.ToList()来保留Lifestyle.PerWebRequest的使用,如果IEnumerable&lt;&gt;,则返回任何具有返回类型的存储库方法。这确保了在处理上下文之前,我需要访问的数据将被加载到内存中。