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();
}
}
}
Vì 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 IDocumentSession
và DbContextFactory
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.