2012-01-27 1 views
2

J'ai une application multitenant dans Asp.NET MVC avec Ninjul et Fluent nHibernate. J'ai une base de données par locataire et je crée une usine de session pour chaque locataire.Ninject: Transmettre l'objet vers le bas à travers des liaisons pour multitenancy

Maintenant, après les connexions de locataire, j'ai besoin (si ce n'est pas le cas) de créer une SessionFactory et d'en extraire une session. Ça c'est fait.

Mon problème est maintenant que l'information spécifique des locataires est extrait du cookie FormsAuth et je dois la transmettre des couches ...

Voici mes couches: Web service données

Lorsque mes contrôleurs ont besoin d'accéder à certaines informations, ils utilisent le service d'information spécifique pour accéder au référentiel de données avec une session qui vient de l'atelier session.

Dans couche de données:

 Bind<SessionFactoryFactory>().ToSelf() 
      .InSingletonScope(); 

     Bind<ISession>() 
      .ToMethod(ctx => ctx.Kernel.Get<SessionFactoryFactory>() 
       .Get(**[??TENANTINFOOBJECT??]**).OpenSession()) 
      .WhenParentNamed("TenantDB") 
      .InRequestScope(); 

     Bind<ISomeInfoRepository>() 
      .To<SomeInfoRepository>() 
      .InRequestScope() 
      .Named("TenantDB"); 

Dans Service de couche:

 Bind<ISomeInfoService>().To<SomeInfoService>() 
      .InRequestScope(); 

Dans Web couche:

public class SomeController : BaseController 
{ 
    ISomeInfoService someInfoService; 

    public SomeController(ISomeInfoService someInfoService) 
    { 
     this.someInfoService= someInfoService; 
    }... 

Comment puis-je envoyer à ma sessionfactory les informations sur les locataires avec Ninject? Lorsqu'une requête Web est effectuée, j'extraire l'ID du locataire du cookie et peut générer l'objet client requis (id + chaîne de connexion). Comment puis-je transmettre les couches avec Ninject à ma SessionFactoryFactory?

+0

Avez-vous un accès à votre conteneur Ninject à partir de votre application MVC? – Restuta

+0

Je le fais, mais je préfère ne pas l'utiliser car ce ne serait pas convivial. Mis à part un NinjectModule pour les liaisons, le Data Layer ne connaît pas Ninject. – Nick

+0

Qu'est-ce qui ne serait pas facile à tester? – Restuta

Répondre

0

Enregistrez un type qui est votre TenantInfo dans la portée de la demande. Ce TenantInfo peut être créé à partir des cookies en utilisant le ToMethod comme vous le faites dans votre question. Puis, liez l'ISession à un fournisseur ninject (une classe qui hérite de Provider). Faites en sorte que ce fournisseur prenne comme argument constructeur (ou propriété) le TenantInfo. Au sein du fournisseur, vous avez alors les informations nécessaires pour construire votre session. pour le locataire.

Questions connexes