RavenDB с Ninject в ASP.NET MVC3 - PullRequest
11 голосов
/ 01 марта 2012

Я хочу использовать RavenDB с ninject в моем проекте asp.net mvc3. Есть идеи, как мне это настроить?

      kernel.Bind<Raven.Client.IDocumentSession>()
              .To<Raven.Client.Document.DocumentStore>()
              .InSingletonScope()
              .WithConstructorArgument("ConnectionString", ConfigurationManager.ConnectionStrings["RavenDB"].ConnectionString);

Ответы [ 2 ]

25 голосов
/ 06 марта 2012

Вот как я делаю мои:

Если вы установите Ninject с Nuget, вы получите файл / App_start / NinjectMVC3.cs. Там:

    private static void RegisterServices(IKernel kernel)
    {            
        kernel.Load<RavenModule>();
    }    

Вот класс RavenModule:

public class RavenModule : NinjectModule
{
    public override void Load()
    {
        Bind<IDocumentStore>()
            .ToMethod(InitDocStore)
            .InSingletonScope();

        Bind<IDocumentSession>()
            .ToMethod(c => c.Kernel.Get<IDocumentStore>().OpenSession())
            .InRequestScope();
    }

    private IDocumentStore InitDocStore(IContext context)
    {
        DocumentStore ds = new DocumentStore { ConnectionStringName = "Raven" };
        RavenProfiler.InitializeFor(ds);
        // also good to setup the glimpse plugin here            
        ds.Initialize();
        RavenIndexes.CreateIndexes(ds);
        return ds;
    }
}

А для полноты вот мой класс создания индекса:

public static class RavenIndexes
{
    public static void CreateIndexes(IDocumentStore docStore)
    {
        IndexCreation.CreateIndexes(typeof(RavenIndexes).Assembly, docStore);
    }

    public class SearchIndex : AbstractMultiMapIndexCreationTask<SearchIndex.Result>
    {
       // implementation omitted
    }
}

Надеюсь, это поможет!

7 голосов
/ 02 марта 2012

Я рекомендую использовать пользовательский Ninject Provider для настройки вашего RavenDB DocumentStore.Сначала поместите это в свой блок кода, который регистрирует ваши Ninject-сервисы.

kernel.Bind<IDocumentStore>().ToProvider<RavenDocumentStoreProvider>().InSingletonScope();

Затем добавьте этот класс, который реализует Ninject Provider.

public class RavenDocumentStoreProvider : Provider<IDocumentStore>
{
  var store = new DocumentStore { ConnectionName = "RavenDB" };
  store.Conventions.IdentityPartsSeparator = "-"; // Nice for using IDs in routing
  store.Initialize();
  return store;
}

IDocumentStore должен быть одиночным,но не делайте IDocumentSession одиночным.Я рекомендую вам просто создать новый IDocumentSession с помощью OpenSession () в экземпляре IDocumentStore, который Ninject дает вам всякий раз, когда вам нужно взаимодействовать с RavenDB.Объекты IDocumentSession очень легкие, следуют шаблону единиц работы, не являются поточно-ориентированными и предназначены для использования и быстрого удаления в случае необходимости.

Как и другие, вы можете также рассмотреть возможность реализации базового контроллера MVC, который переопределяет методы OnActionExecuting и OnActionExecuted для открытия сеанса и сохранения изменений, соответственно.

...