RavenDb チュートリアルによると、アプリケーションにはIDocumentStore
インスタンスが 1 つだけ必要です (データベースごとに想定)。AIDocumentStore
はスレッドセーフです。IDocumentSession
インスタンスを生成し、それらは RavenDBの作業単位を表しますが、それらはスレッドセーフではありません。したがって、スレッド間でセッションを共有しないでください。
RavenDb で使用するコンテナーをセットアップする方法は、主にアプリケーションの設計によって異なります。問題は、消費者に何を注入したいのかということです。、IDocumentStore
またはIDocumentSession
?
を使用するとIDocumentStore
、登録は次のようになります。
// Composition Root
IDocumentStore store = new DocumentStore
{
ConnectionStringName = "http://localhost:8080"
};
store.Initialize();
container.RegisterSingle<IDocumentStore>(store);
コンシューマーは次のようになります。
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
、コンシューマー自身がセッションの管理 (作成、保存、破棄) を担当します。これは、小さなアプリケーションや、メソッド内で呼び出すリポジトリの背後にある RavenDb データベースを非表示にする場合などに非常に便利です。session.SaveChanges()
repository.Save(entity)
しかし、このタイプの作業単位の使用は、大規模なアプリケーションでは問題があることがわかりました。代わりにできることは、IDocumentSession
消費者に を注入することです。その場合、登録は次のようになります。
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());
拡張メソッドを使用するには、 Simple Injector ASP.NET Integration NuGet パッケージ(または、既定のダウンロードに含まれているSimpleInjector.Integration.Web.dllをプロジェクトに含める)が必要であることに注意してください。RegisterPerWebRequest
問題は、どこに電話すればよいsession.SaveChanges()
かということになります。
Web リクエストごとの作業単位の登録に関する質問があり、これは に関する質問にも対応していますSaveChanges
。この回答をよく見てください: Web リクエストごとに 1 つの DbContext …なぜ? . 単語DbContext
をIDocumentSession
andに置き換えるDbContextFactory
とIDocumentStore
、RavenDb のコンテキストで読み取ることができます。RavenDb を使用する場合、おそらくビジネス トランザクションまたは一般的なトランザクションの概念はそれほど重要ではないことに注意してください。これは、自分で見つけなければならないものです。