Tôi khuyên bạn nên sử dụng Nhà cung cấp Ninject tùy chỉnh để thiết lập Kho lưu trữ tài liệu RavenDB của bạn. Trước tiên, hãy đặt điều này trong khối mã đăng ký dịch vụ Ninject của bạn.
kernel.Bind<IDocumentStore>().ToProvider<RavenDocumentStoreProvider>().InSingletonScope();
Tiếp theo, thêm lớp này triển khai Nhà cung cấp Ninject.
public class RavenDocumentStoreProvider : Provider<IDocumentStore>
{
var store = new DocumentStore { ConnectionName = "RavenDB" };
store.Conventions.IdentityPartsSeparator = "-"; // Nice for using IDs in routing
store.Initialize();
return store;
}
IDocumentStore cần phải là đơn, nhưng không làm cho IDocumentSession trở thành đơn. Tôi khuyên bạn chỉ cần tạo một IDocumentSession mới bằng cách sử dụng OpenSession() trên cá thể IDocumentStore Ninject cung cấp cho bạn bất cứ khi nào bạn cần tương tác với RavenDB. Các đối tượng IDocumentSession rất nhẹ, tuân theo mẫu đơn vị công việc, không an toàn và có nghĩa là được sử dụng và nhanh chóng xử lý khi cần.
Khi người khác đã thực hiện, bạn cũng có thể xem xét việc triển khai bộ điều khiển cơ sở MVC ghi đè phương pháp OnActionExecuting và OnActionExecuted để mở phiên và lưu thay đổi tương ứng.
+1 Ninject giúp dễ dàng thực hiện phiên cho mỗi yêu cầu khi được trả lời bằng cách sử dụng InRequestScope() http://bit.ly/HJADY3 – DalSoft
Nơi bạn gọi SaveChanges()? Tôi đã cố gắng để làm điều đó trong Application_EndRequest không có may mắn. – Andrew
Tôi gọi SaveChanges() một cách rõ ràng khi nó có ý nghĩa để làm như vậy, không tự động ở cuối mỗi yêu cầu. Tôi không chắc chắn tại sao bạn cần phải làm điều đó hoặc tại sao bạn đang gặp vấn đề. Tôi nghi ngờ nó có một cái gì đó để làm với thứ tự hoạt động của Ninject với yêu cầu phụ thuộc phạm vi, mặc dù không có nói mà không có một số thông tin chẩn đoán. –