5

MVC 3 Web アプリケーションの IOC にSimple Injectorを使用しています。データストレージにRavenDBを使用しています。mvc 3 アプリケーションで RavenDB を使用する場合、いくつかの考慮事項があります。RavenDB を使用するために IoC を接続する方法についていくつか検索しましたが、単純なインジェクターを接続して RavenDB を使用する方法がわかりませんでした。MVC 3 Web アプリで RavenDB を使用するためにシンプルなインジェクターを接続する方法を説明できる人はいますか?

ありがとう。

4

1 に答える 1

14

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 …なぜ? . 単語DbContextIDocumentSessionandに置き換えるDbContextFactoryIDocumentStore、RavenDb のコンテキストで読み取ることができます。RavenDb を使用する場合、おそらくビジネス トランザクションまたは一般的なトランザクションの概念はそれほど重要ではないことに注意してください。これは、自分で見つけなければならないものです。

于 2012-06-07T22:56:21.210 に答える