我正在使用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
)?(有很多)?
答案 0 :(得分:1)
一种方法是创建一个挂钩EndRequest事件的IHttpModule(或在Global.asax中实现EndRequest) - 让它从容器中检索数据库上下文并进行处理。
答案 1 :(得分:0)
For<DB>().HttpContextScoped().Use(() => new DB());
For<DB>().HttpContextScoped().Use(new DB());