2012-03-01 7 views
8

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?

risposta

5

AndrewF,

Si avranno due sessioni, quindi. Uno che è il defualt (OpenSession()) e l'altro che è per l'inquilino (OpenSession(TenantId))

+2

Tnx, ma chiamiamo 'OpenSession' sullo stesso' DocumentStore' o abbiamo anche bisogno di un secondo 'DocumentStore'? –

+3

No, un archivio di documenti è sufficiente. –

Problemi correlati