4

Ravendb に IoC (Ninject) を実装しようとしていますが、ちょっとした問題が発生しました。http://www.dotnetguy.co.uk/post/2010/06/12/raven-db-ndash-part-1-ndash-documentsession-per-request-with-structuremapのコードを使用して支援しています。

public interface IRavenSessionFactoryBuilder
{
    IRavenSessionFactory GetSessionFactory();
}

public class RavenSessionFactoryBuilder : IRavenSessionFactoryBuilder
{
    private IRavenSessionFactory _ravenSessionFactory;

    public IRavenSessionFactory GetSessionFactory()
    {
        return _ravenSessionFactory ?? (_ravenSessionFactory = CreateSessionFactory());
    }

    private static IRavenSessionFactory CreateSessionFactory()
    {
        Debug.Write("IRavenSessionFactory Created");
        return new RavenSessionFactory(new DocumentStore
                                           {
                                               Url =
                                                   System.Web.Configuration.WebConfigurationManager.AppSettings[
                                                       "Raven.DocumentStore"]
                                           });
    }
}

public interface IRavenSessionFactory
{
    IDocumentSession CreateSession();
}

public class RavenSessionFactory : IRavenSessionFactory
{
    private readonly IDocumentStore _documentStore;

    public RavenSessionFactory(IDocumentStore documentStore)
    {
        if (_documentStore != null) return;
        _documentStore = documentStore;
        _documentStore.Initialize();
    }

    public IDocumentSession CreateSession()
    {
        Debug.Write("IDocumentSession Created");
        return _documentStore.OpenSession();
    }
}

次の構造マップ構文を変換する方法がわかりません。

ObjectFactory.Configure(x => x.For<IDocumentSession>()
                  .HybridHttpOrThreadLocalScoped()
                  .AddInstances(inst => inst.ConstructedBy
                    (context => context.GetInstance<IRavenSessionFactoryBuilder>()
                      .GetSessionFactory().CreateSession())));

私の試みでは、新しいコンストラクターのため、すべてのリクエストで _ravenSessionFactory が null です。

Bind<IDocumentSession>().ToMethod(
            x => new RavenSessionFactoryBuilder().GetSessionFactory().CreateSession()).RequestScope();

時間を割いて説明を手伝ってくれてありがとう。

4

4 に答える 4

13

Ninject ではファクトリはプロバイダーと呼ばれます。SessionFactorySessionProvider:-に変換します

public class RavenSessionProvider : Provider<IDocumentSession>
{
    private readonly IDocumentStore _documentStore;

    public RavenSessionFactory(IDocumentStore documentStore)
    {
        _documentStore = documentStore;
    }

    public IDocumentSession GetInstance(IContext ctx)
    {
        Debug.Write("IDocumentSession Created");
        return _documentStore.OpenSession();
    }
}

また、RavenSessionFactoryBuilder を DocumentStoreProvider に変更します。

public class DocumentStoreProvider : Provider<IDocumentStore>
{
    public IDocumentStore GetInstance(IContext ctx)
    {
        var store = new DocumentStore 
                   { Url = System.Web.Configuration.WebConfigurationManager.AppSettings["Raven.DocumentStore"]});
        store.Initialize();
        return store;
    }
}

そしてバインディングを追加します:

Bind<RavenSessionProvider>().ToSelf().InSingletonScope()
Bind<IDocumentSession>().ToProvider<RavenSessionProvider>();
于 2011-04-06T21:31:34.967 に答える
1

Instead of new RavenSessionFactoryBuilder().GetSessionFactory()...., I would think you'd want:

Kernel.Get<IRavenSessionFactoryBuilder>().GetSessionFactory()....

where you've done something like this beforehand:

Bind<IRavenSessionFactoryBuilder>().To<IRavenSessionFactoryBuilder>()
  .InSingletonScope();

Disclaimer: I've never tried a Get in a Bind statement before. You might need a factory method.

于 2011-04-05T22:03:36.467 に答える
0

これを行うためにファクトリーやプロバイダーなどを作成する必要はありません。

Ninject は、InSingletonScope() でドキュメント ストアをバインドする Ninject モジュールを作成し、Request スコープで DocumentSession をバインドして、すぐに使用できるように、リクエストごとのセッションを実行します。

Ninject と RavenDB のステップ バイ ステップ ガイドをブログに書きました

http://www.dalsoft.co.uk/blog/index.php/2012/04/12/mvc-get-ravendb-up-and-running-in-5-minutes-using-ninject/

于 2012-04-16T11:08:48.820 に答える
0

Ninject には、基本的にスコープの 5 つのオプションがあります。

TransientScope - 使用しているものは、リクエストごとに新しいインスタンスが作成されることを意味します

SingletonScope - 作成されるインスタンスは 1 つだけです

ThreadScope - スレッドごとに 1 つのインスタンスのみが作成されます

RequestScope - HttpRequest ごとに 1 つのインスタンスのみが作成されます

カスタム - スコープ オブジェクトを指定します

Web アプリを作成している場合は指定でき.InRequestScope()ます。Windows アプリの場合は指定できます。.InThreadScope()

最後に、ハイブリッドを指定する必要がある場合(構造マップでどのように機能するかは完全にはわかりません)、そうするかもしれません.InScope(ctx => HttpRequest.Current != null ? HttpRequest.Current : Thread.CurrentThread)

于 2011-04-05T21:35:08.127 に答える