2012-03-01 27 views
11

Tôi muốn sử dụng RavenDB với ninject trong dự án asp.net mvc3 của tôi, Bất kỳ ý tưởng làm thế nào tôi phải cấu hình này?RavenDB với Ninject trong ASP.NET MVC3

 kernel.Bind<Raven.Client.IDocumentSession>() 
       .To<Raven.Client.Document.DocumentStore>() 
       .InSingletonScope() 
       .WithConstructorArgument("ConnectionString", ConfigurationManager.ConnectionStrings["RavenDB"].ConnectionString); 

Trả lời

25

Đây là cách tôi làm tôi:

Nếu bạn cài đặt Ninject với NuGet, bạn sẽ nhận được một tập tin/App_start/NinjectMVC3.cs. Trong đó:

private static void RegisterServices(IKernel kernel) 
    {    
     kernel.Load<RavenModule>(); 
    }  

Đây là lớp RavenModule:

public class RavenModule : NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<IDocumentStore>() 
      .ToMethod(InitDocStore) 
      .InSingletonScope(); 

     Bind<IDocumentSession>() 
      .ToMethod(c => c.Kernel.Get<IDocumentStore>().OpenSession()) 
      .InRequestScope(); 
    } 

    private IDocumentStore InitDocStore(IContext context) 
    { 
     DocumentStore ds = new DocumentStore { ConnectionStringName = "Raven" }; 
     RavenProfiler.InitializeFor(ds); 
     // also good to setup the glimpse plugin here    
     ds.Initialize(); 
     RavenIndexes.CreateIndexes(ds); 
     return ds; 
    } 
} 

Và cho đầy đủ đây là lớp tạo chỉ mục của tôi:

public static class RavenIndexes 
{ 
    public static void CreateIndexes(IDocumentStore docStore) 
    { 
     IndexCreation.CreateIndexes(typeof(RavenIndexes).Assembly, docStore); 
    } 

    public class SearchIndex : AbstractMultiMapIndexCreationTask<SearchIndex.Result> 
    { 
     // implementation omitted 
    } 
} 

Tôi hy vọng điều này sẽ giúp!

+0

+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

+0

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

+0

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. –

7

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.

Các vấn đề liên quan