abbiamo un'installazione di un'applicazione MVC3 con RavenDB nel modo seguente (con qualche aiuto da NoSql with RavenDb and Asp.net MVC):Come multi-tenancy di installazione all'interno di 3 applicazione MVC con RavenDB
Il codice seguente è nel 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]; }
}
Ora vogliamo impostare l'applicazione per supportare la multi-tenancy. Vogliamo avere due archivi di documenti: uno per scopi generali, il database di sistema e uno per l'attuale (loggato) tennant.
In base alla nostra configurazione attuale, come possiamo raggiungere questo risultato?
Edit: Abbiamo ora configurato la nostra applicazione come segue:
abbiamo aggiunto OpenSession(tenantid)
-BeginRequest
sullo stesso documentStore (grazie alla risposta qui sotto da Ayende)
var tenant = HttpContext.Current.Request.Headers["Host"].Split('.')[0];
documentStore.DatabaseCommands.EnsureDatabaseExists(tenant);
HttpContext.Current.Items[RavenSessionKey] =
documentStore.OpenSession(tenant);
Poiché stiamo usando Ninject per DI abbiamo aggiunto le seguenti associazioni per assicurarci di utilizzare la sessione corretta:
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>();
Forse c'è un modo migliore per configurare la multitenancy con ravendb e mvc?
Tnx, ma chiamiamo 'OpenSession' sullo stesso' DocumentStore' o abbiamo anche bisogno di un secondo 'DocumentStore'? –
No, un archivio di documenti è sufficiente. –