RavenDB с Ninject в ASP.NET MVC3
Я хочу использовать RavenDB с ninject в моем проекте asp.net mvc3. Любая идея, как мне это настроить?
kernel.Bind<Raven.Client.IDocumentSession>()
.To<Raven.Client.Document.DocumentStore>()
.InSingletonScope()
.WithConstructorArgument("ConnectionString", ConfigurationManager.ConnectionStrings["RavenDB"].ConnectionString);
Ответы
Ответ 1
Вот как я делаю свое:
Если вы устанавливаете 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
}
}
Надеюсь, это поможет!
Ответ 2
Я рекомендую использовать пользовательский поставщик Ninject для настройки вашего RavenDB DocumentStore. Сначала разместите это в своем блоке кода, который регистрирует ваши службы Ninject.
kernel.Bind<IDocumentStore>().ToProvider<RavenDocumentStoreProvider>().InSingletonScope();
Затем добавьте этот класс, который реализует поставщик Ninject.
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, чтобы открыть сеанс и сохранить изменения соответственно.