2012-03-01 14 views
8

Tenemos una instalación de la aplicación MVC3 con RavenDb de la siguiente manera (con la ayuda de NoSql with RavenDb and Asp.net MVC):Cómo multitenancy configuración dentro de una aplicación MVC 3 con ravendb

El siguiente código se encuentra en el 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]; } 
} 

Ahora queremos configurar la aplicación para que sea compatible con multitenancy. Queremos tener dos almacenes de documentos: uno para uso general, la base de datos del sistema y otro para el tennant actual (conectado).

Según nuestra configuración actual, ¿cómo hacemos para lograr esto?

Editar: Ahora configuramos nuestra aplicación de la siguiente manera:

añadimos OpenSession(tenantid)-BeginRequest en el mismo documentStore (gracias a la respuesta por debajo de Ayende)

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

Como estamos usando Ninject para DI agregamos los siguientes enlaces para asegurarnos de estar utilizando la sesión correcta:

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

¿Quizás exista una forma mejor de configurar multiempresas con ravendb y mvc?

Respuesta

5

AndrewF,

Usted va a tener dos sesiones, a continuación. Uno que es el defualt (OpenSession()) y el otro que es para el inquilino (OpenSession(TenantId))

+2

Tnx, pero ¿llamamos 'OpenSession' en el mismo' DocumentStore' o también necesitamos un segundo 'DocumentStore'? –

+3

No, una tienda de documentos es suficiente. –

Cuestiones relacionadas