Как настроить многопользовательский режим в приложении MVC 3 с ravendb - PullRequest
8 голосов
/ 01 марта 2012

Мы настроили приложение 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 в том же хранилище документов (благодаря ответу ниже от Айенде)

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>();

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

1 Ответ

5 голосов
/ 01 марта 2012

AndrewF,

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

...