2011-02-16 9 views
7

Tôi muốn chắc chắn nếu structuremap sẽ xử lý DataContext của tôi sau khi yêu cầu kết thúc.Cấu trúc sơ đồ Xử lý đối tượng DataContext

Đây là thiết lập của tôi

ForRequestedType<MyDataContext>().TheDefault.Is.OfConcreteType<MyDataContext>(); 
SelectConstructor<MyDataContext>(() => new MyDataContext()); 

sẽ StructureMap tự định đoạt DataContext của tôi hay tôi cần phải gọi hàm Dispose tay ??

Trả lời

4

Không, nó sẽ không tự động loại bỏ nó, trừ khi bạn sử dụng các vùng chứa lồng nhau và vứt bỏ thùng chứa giữ cá thể ngữ cảnh. Tùy thuộc vào người tạo bối cảnh để Vứt bỏ nó. Người tạo thường sẽ là một phần của mã của bạn gọi ObjectContext.GetInstance<MyDataContext> hoặc phương pháp gốc khiến Sơ đồ trang web chèn một DataContext vào một trong các đối tượng của bạn.

Thực tiễn phổ biến là tạo ngữ cảnh cho mỗi HttpRequest và xử lý ngữ cảnh ở cuối yêu cầu.

+0

Cảm ơn bạn. Đã chấp nhận câu trả lời. –

9

Đó là những gì tôi làm:

For<IUnitOfWork>() 
     .HybridHttpOrThreadLocalScoped() 
     .Use<BpReminders.Data.NH.UnitOfWork>(); 

    For<ISession>() 
     .HybridHttpOrThreadLocalScoped() 
     .Use(o => ((BpReminders.Data.NH.UnitOfWork)o.GetInstance<IUnitOfWork>()).CurrentSession); 

và ...

protected void Application_EndRequest(object sender, EventArgs e) 
{ 
    ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects(); 
} 

HybridHttpOrThreadLocalScoped sử dụng HttpContext when available.

StructureMap trông sau mọi thứ, sau đó. Chỉ cần nhớ triển khai IDisposable trong lớp học của bạn.

+0

Mặc dù trong SM sử dụng HybridHttpOrThreadLocalScoped sẽ sử dụng lưu trữ ThreadLocal, gọi ReleaseAndDisposeAllHttpScopedObjects ném một ngoại lệ. Bạn có thể cho tôi biết làm thế nào bạn đã quản lý để xử lý các đối tượng được lưu trữ trong ThreadLocal? – Roman

+0

@Am: Bạn không thể sử dụng HybridHttpOrThreadLocalScoped là một thành viên của HttpContextLifecycle. Tôi đã thấy rằng ThreadLocalStorageLifecycle (đó là một trong những bạn đang quan tâm đến) đã có một phương pháp được gọi là EjectAll. Tôi đã không bao giờ sử dụng nó, suy nghĩ, và không bao giờ thực sự đào sâu vào điều này. – LeftyX