Как настроить многозадачность в приложении mvc 3 с помощью ravendb

У нас есть установка приложения mvc3 с RavenDb следующим образом (с некоторой помощью NoSql с RavenDb и Asp.net MVC):

Следующий код находится в файле Global.asax

private const string RavenSessionKey = "RavenMVC.Session";
private static DocumentStore documentStore;
protected void Application_Start()
{
 //Create a DocumentStore in Application_Start
 //DocumentStore should be created once per 
 //application and stored as a singleton.
 documentStore = new DocumentStore { Url = "http://localhost:8080/" };
 documentStore.Initialise();
 AreaRegistration.RegisterAllAreas();
 RegisterRoutes(RouteTable.Routes);
 //DI using Unity 2.0
 ConfigureUnity();
}
public MvcApplication()
{
 //Create a DocumentSession on BeginRequest 
 //create a document session for every unit of work
 BeginRequest += (sender, args) => 
 {
 HttpContext.Current.Items[RavenSessionKey] = documentStore.OpenSession();
 }
 //Destroy the DocumentSession on EndRequest
 EndRequest += (o, eventArgs) =>
 {
 var disposable = 
 HttpContext.Current.Items[RavenSessionKey] as IDisposable;
 if (disposable != null)
 disposable.Dispose();
 };
}
//Getting the current DocumentSession
public static IDocumentSession CurrentSession
{
 get { return (IDocumentSession)HttpContext.Current.Items[RavenSessionKey]; }
}

Теперь мы хотим настроить приложение для поддержки многоуровневости. Мы хотим иметь два документарных магазина: один для общего назначения, системную базу данных и один для текущего (зарегистрированного) теннанта.

Основываясь на нашей текущей настройке, как мы можем добиться этого?

Изменить. Теперь мы настроили наше приложение следующим образом:

Мы добавили OpenSession(tenantid) в BeginRequest на тот же documentStore (благодаря ответу ниже из ******)

var tenant = HttpContext.Current.Request.Headers["Host"].Split('.')[0];
documentStore.DatabaseCommands.EnsureDatabaseExists(tenant);
HttpContext.Current.Items[RavenSessionKey] = 
 documentStore.OpenSession(tenant);

Поскольку мы используем Ninject для DI, мы добавили следующие привязки, чтобы убедиться, что мы используем правильный сеанс:

kernel.Bind<isession>().To<session>().WhenInjectedInto<userservice>();
kernel.Bind<isession>().To<tenantsession>();
kernel.Bind<idocumentsession>().ToMethod(ctx => 
 MvcApplication.CurrentSession).WhenInjectedInto<session>();
kernel.Bind<idocumentsession>().ToMethod(ctx => 
 MvcApplication.CurrentTenantSession).WhenInjectedInto<tenantsession>();
</tenantsession></idocumentsession></session></idocumentsession></tenantsession></isession></userservice></session></isession>

Может быть, есть лучший способ настроить многозадачность с ravendb и mvc?

1 ответ

AndrewF,

Тогда у вас будет две сессии. Тот, который является defualt (OpenSession()), а другой для арендатора (OpenSession(TenantId))

licensed under cc by-sa 3.0 with attribution.