2017-06-28 1 views
0

J'utilise Autofac comme conteneur IoC avec le package Autofac.Multitenant pour le multi-tenancy.L'application ASP.NET multi-locataires Autofac renvoie le locataire à la place de l'identifiant

J'ai une configuration de conteneur comme ceci:

var builder = new ContainerBuilder(); 

// Register the controllers  
builder.RegisterControllers(typeof(Deskful.Web.DeskfulApplication).Assembly); 

// Tenant Identifier 
var tenantIdentifier = new RequestSubdomainStrategy(); 

builder.RegisterInstance(tenantIdentifier).As<ITenantIdentificationStrategy>(); 

// Build container 
var container = builder.Build(); 

// Tenant container 
var mtc = new MultitenantContainer(tenantIdentifier, container); 

// Set autofac as dependency resolver 
DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 

Et ma stratégie d'identification:

public class RequestSubdomainStrategy : ITenantIdentificationStrategy 
{ 
    public bool TryIdentifyTenant(out object tenantId) 
    { 
     tenantId = null; 

     try 
     { 
      var context = HttpContext.Current; 
      if (context != null && context.Request != null) 
      { 
       var site = context.Request.Url.Host; 

       tenantId = 1; 
      } 
     } 
     catch { } 

     return tenantId != null; 
    } 
} 

Puis, dans mon contrôleur où je dois le locataire que je peux faire ce qui suit après l'injection du ITenantIdentificationStrategy:

var tenantId = this.TenantIdStrategy.IdentifyTenant<int>(); 

Ma question est, comment puis-je stocker l'objet locataire d ur mon processus d'identification afin que je puisse accéder à toutes les propriétés du locataire?

Parce que maintenant il ne renvoie que l'ID.

Répondre

0

Je ne sais pas si c'est une solution correcte, mais j'ai fini par faire ce qui suit.

D'abord, je créé une nouvelle interface pour étendre la ITenantIdentificationStrategy actuelle:

public interface IDeskfulTenantIdentificationStrategy : ITenantIdentificationStrategy 
{ 
    ITenant Tenant { get; } 
} 

J'étendu l'interface avec la propriété immobilière.

Puis dans ma classe d'identifiant je mis la propriété des locataires lors de l'identification:

public class RequestSubdomainStrategy : IDeskfulTenantIdentificationStrategy 
{ 
    private ITenant _tenant; 

    public ITenant Tenant 
    { 
     get 
     { 
      return _tenant; 
     } 
     private set 
     { 
      _tenant = value; 
     } 
    } 

    public bool TryIdentifyTenant(out object tenantId) 
    { 
     tenantId = null; 

     try 
     { 
      var context = HttpContext.Current; 
      if (context != null && context.Request != null) 
      { 
       var site = context.Request.Url.Host; 

       Tenant = new Tenant("tenant1.deskfull.be", "connString", "Tenant 1") { Id = 20 }; 

       tenantId = Tenant.Id; 
      } 
     } 
     catch { } 

     return tenantId != null; 
    } 
} 

Et enfin j'enregistrer le nouveau inteface dans mon conteneur autofac:

var tenantIdentifier = new RequestSubdomainStrategy(); 

builder.RegisterInstance(tenantIdentifier) 
.As<IDeskfulTenantIdentificationStrategy>(); 

Quand je l'utilise alors ce dans mon contrôleur, je peux faire ce qui suit:

public string Index() 
{ 
    int tenantId = TenantIdStrategy.IdentifyTenant<int>(); 

    return "Home - Index: " + TenantIdStrategy.Tenant.TenantName; 
}