5

Tôi đang sử dụng Simple Injector cho IOC trong ứng dụng web MVC 3. Tôi đang sử dụng RavenDB để lưu trữ dữ liệu. Có một số cân nhắc về việc sử dụng RavenDB trong một ứng dụng mvc 3. Tôi đã tìm kiếm một số trên làm thế nào để dây lên một IoC để sử dụng RavenDB nhưng không tìm ra cách để dây-up phun đơn giản để sử dụng RavenDB. Bất cứ ai có thể giải thích làm thế nào để dây-up phun đơn giản để sử dụng RavenDB trong một ứng dụng web MVC 3?Cách cấu hình Simple Injector IoC để sử dụng RavenDB

cảm ơn.

Trả lời

13

Theo số RavenDb tutorial, ứng dụng của bạn cần chính xác một ví dụ IDocumentStore (mỗi cơ sở dữ liệu mà tôi giả định). Một IDocumentStore là an toàn chỉ. Nó tạo ra các trường hợp IDocumentSession và chúng đại diện cho một unit of work trong RavenDB và các trường hợp đó là không phải là an toàn chỉ. Do đó, bạn nên không phải phiên chia sẻ giữa các chuỗi.

Cách thiết lập vùng chứa của bạn để sử dụng với RavenDb chủ yếu phụ thuộc vào thiết kế ứng dụng. Câu hỏi đặt ra là: bạn muốn tiêm gì vào người tiêu dùng? IDocumentStore hoặc IDocumentSession?

Khi bạn đi với IDocumentStore, đăng ký của bạn có thể trông như thế này:

// Composition Root 
IDocumentStore store = new DocumentStore 
{ 
    ConnectionStringName = "http://localhost:8080" 
}; 

store.Initialize(); 

container.RegisterSingle<IDocumentStore>(store); 

Một người tiêu dùng có thể trông như thế này:

public class ProcessLocationCommandHandler 
    : ICommandHandler<ProcessLocationCommand> 
{ 
    private readonly IDocumentStore store; 

    public ProcessLocationCommandHandler(IDocumentStore store) 
    { 
     this.store = store; 
    } 

    public void Handle(ProcessLocationCommand command) 
    { 
     using (var session = this.store.OpenSession()) 
     { 
      session.Store(command.Location); 

      session.SaveChanges(); 
     }    
    } 
} 

IDocumentStore được tiêm, người tiêu dùng tự chịu trách nhiệm về quản lý phiên: tạo, lưu và xử lý. Điều này rất thuận tiện cho các ứng dụng nhỏ, hoặc ví dụ khi ẩn cơ sở dữ liệu RavenDb phía sau repository, nơi bạn gọi session.SaveChanges() bên trong phương thức repository.Save(entity).

Tuy nhiên, tôi thấy loại sử dụng đơn vị công việc này là vấn đề đối với các ứng dụng lớn hơn. Vì vậy, những gì bạn có thể làm thay vào đó, đang tiêm IDocumentSession vào người tiêu dùng. Trong trường hợp đó đăng ký của bạn có thể trông như thế này:

IDocumentStore store = new DocumentStore 
{ 
    ConnectionStringName = "http://localhost:8080" 
}; 

store.Initialize(); 

// Register the IDocumentSession per web request 
// (will automatically be disposed when the request ends). 
container.RegisterPerWebRequest<IDocumentSession>(
    () => store.OpenSession()); 

Lưu ý rằng bạn cần Simple Injector ASP.NET Integration NuGet package (hoặc bao gồm các SimpleInjector.Integration.Web.dll để dự án của bạn, được bao gồm trong việc tải xuống mặc định) để được có thể sử dụng phương thức mở rộng RegisterPerWebRequest.

Câu hỏi bây giờ trở thành, nơi để gọi session.SaveChanges()?

Có câu hỏi về việc đăng ký đơn vị tác phẩm theo yêu cầu web, cũng đề cập đến câu hỏi về SaveChanges. Xin hãy xem câu trả lời này: One DbContext per web request…why?. Khi bạn thay thế các từ DbContext bằng IDocumentSessionDbContextFactory với IDocumentStore, bạn sẽ có thể đọc nó trong ngữ cảnh của RavenDb. Lưu ý rằng có lẽ khái niệm về giao dịch kinh doanh hoặc giao dịch nói chung không quan trọng khi làm việc với RavenDb, nhưng tôi thành thật không biết. Đây là một cái gì đó bạn sẽ phải tìm ra cho chính mình.

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