处理注入LINQ数据上下文的无痛方法?

时间:2011-01-17 12:32:57

标签: linq dependency-injection structuremap datacontext dispose

我正在使用StructureMap向我的每个存储库中注入一个新的数据上下文。生命周期是每个HTTP上下文。但是我遇到了“无效的转换指定错误”的问题,我已经将其缩小为“不处理数据上下文”。查看我的related question

在不修改每个读/写存储库方法的情况下,我应该在哪里处理我的数据上下文(DB类)?无论我在哪里修改数据,我都在using(...)中使用了一个新的DB(),所以它只需要IQueryable<xxx> Getxxx(...)方法,但是其中一些是相互依赖的,所以我不想要一个处理导致DataContext disposed错误。

自举:

public class DBServiceRegistry : Registry
{
    public DBServiceRegistry()
    {
        For<DB>().HttpContextScoped().Use(new DB());
        }
    }

存储库:

这个数据上下文传递给我的存储库,它们接受它:

public class SqlProductRepository : IProductRepository //, IDisposable
{
    private DB _db;

    public SqlProductRepository(DB db)
    {
        _db = db;
    }
    ...
}

查询:

public IQueryable<Models.Product> GetProducts()
{
    var products =
        from p in _db.Products
        let images = GetProductImages().WithProductID(p.ProductId)
        select new Models.Product
        {
            ID = p.ProductId,
            ProductCode = p.ProductCode,
            Name = p.Name,
            Description = p.Description,
            Price = p.Price,
            DateModified = p.Date,
            ModelID = p.ModelId,
            Images = new LazyList<Models.ProductImage>(images),
            EditedBy = p.UserId,
            IsTaxable = p.IsTaxable,
            Inventory = p.InventoryStatus,
            Slug = p.Slug
        };

    return products;
}

我尝试制作SqlProductRepository IDisposable,但错误仍然存​​在。如何在不修改每种方法的情况下干净地处理我的数据上下文(DB)?(有很多)?

2 个答案:

答案 0 :(得分:1)

一种方法是创建一个挂钩EndRequest事件的IHttpModule(或在Global.asax中实现EndRequest) - 让它从容器中检索数据库上下文并进行处理。

答案 1 :(得分:0)

解决方案

为存储库实现IDisposable并使用:

For<DB>().HttpContextScoped().Use(() => new DB());

而不是

For<DB>().HttpContextScoped().Use(new DB());