Mục tiêu của tôi là có một ngữ cảnh dữ liệu (MainDbContext
) theo yêu cầu HTTP trong ASP.NET MVC và hủy bỏ bối cảnh dữ liệu khi yêu cầu kết thúc.StructureMap không loại bỏ bối cảnh dữ liệu khi sử dụng HttpContextScoped()
Tôi đang sử dụng cấu hình StructureMap sau:
public static class ContainerConfigurer
{
public static void Configure()
{
ObjectFactory.Initialize(x =>
{
x.For<MainDbContext>().HttpContextScoped();
});
}
}
Bất cứ khi nào tôi cần một MainDbContext
, Tôi đang sử dụng mã này:
var dbContext = ObjectFactory.GetInstance<MainDbContext>();
này đang làm việc như mong đợi: chỉ có một bối cảnh dữ liệu đang được tạo theo yêu cầu HTTP. Vấn đề là, MainDbContext
không được xử lý ở cuối yêu cầu.
Làm cách nào tôi có thể định cấu hình ObjectFactory để xử lý ngữ cảnh dữ liệu khi yêu cầu HTTP kết thúc? Hoặc đây chỉ là một cái gì đó tôi cần phải làm bằng tay bằng cách sử dụng Application_EndRequest()
trong Global.asax.
Cập nhật
Tôi chỉ cố gắng thêm mã sau đây để Global.asax:
protected virtual void Application_EndRequest()
{
ObjectFactory.GetInstance<MainDbContext>().Dispose();
}
Đúng như dự đoán, điều này giải quyết vấn đề. Tôi vẫn tự hỏi nếu có bất kỳ cách nào để làm điều này tự động với StructureMap, tuy nhiên.
không có sự khác biệt. 'Dispose()' vẫn chưa được gọi. – devuxer
Tôi đã tiêm một ngữ cảnh dữ liệu vào kho/dịch vụ của tôi như bạn đề xuất. Vấn đề là, tôi cũng có ActionFilters, Validators, và MembershipProvider yêu cầu bối cảnh dữ liệu, và vì các đối tượng này được tự động hóa bởi ASP.NET MVC (giống như controller), tôi đang sử dụng StructureMap để quản lý toàn bộ thời gian ngữ cảnh dữ liệu. Nếu bạn có giải pháp tốt hơn, vui lòng cho tôi biết. – devuxer
@DanM, bạn là chính xác, tôi đã thử nghiệm nó và có vẻ như 'StructureMap' không tự động vứt bỏ' IDisposable' đối tượng phạm vi HttpContext ở phần cuối của yêu cầu. Gọi 'ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects' trong' Application_EndRequest' có lẽ là cách tốt nhất để đảm bảo rằng điều này xảy ra cho tất cả các đối tượng. –