2017-05-01 1 views
0

authorize Ce qui suit est mon dépendance résolveur MEFobjet Injecté est toujours nul dans la coutume attribut

public class MEFDependencyResolver : IDependencyResolver, System.Web.Http.Dependencies.IDependencyResolver 
{ 
    private readonly CompositionContainer _container; 

    public MEFDependencyResolver(CompositionContainer container) 
    { 
     if (container == null) throw new ArgumentNullException("container"); 

     _container = container; 
    } 

    public object GetService(Type serviceType) 
    { 
     if (serviceType == null) throw new ArgumentNullException("serviceType"); 

     var name = AttributedModelServices.GetContractName(serviceType); 

     return Enumerable.Any(_container.Catalog.Parts.SelectMany(part => part.ExportDefinitions), e => e.ContractName == name) ? _container.GetExportedValue<object>(name) : null; 
    } 

    public IEnumerable<object> GetServices(Type serviceType) 
    { 
     if (serviceType == null) throw new ArgumentNullException("serviceType"); 

     var name = AttributedModelServices.GetContractName(serviceType); 

     return _container.GetExportedValues<object>(name); 
    } 

    public System.Web.Http.Dependencies.IDependencyScope BeginScope() 
    { 
     return this; 
    } 

    public void Dispose() 
    { 
    } 

} 

Après est ma classe que je veux injecter.

[Export(typeof(IClientService))] 
public class ClientService : IClientService { } 

Voici mon attribut d'autorisation personnalisé.

public class CustomAuthorize : AuthorizeAttribute 
{ 
    [Import] 
    protected IClientService ClientService { get; set; } 

    public string Status { get; set; } 

    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     var isAuthorized = base.AuthorizeCore(httpContext); 
     if (!isAuthorized) 
     { 
      return false; 
     } 

     return IsControllerAccessible(httpContext.User); 
    } 

    private bool IsControllerAccessible(IPrincipal user) 
    { 
     var client = ClientService.GetClient();//ClientService object is null here.    

     return true; 
    } 
} 

L'objet ClientService de type IClientService est toujours null. Il semble que le résolveur de dépendances, MEF dans ce cas, n'est pas capable de résoudre la dépendance pour les attributs personnalisés.

Quel est le problème réel ici?

Guidez-moi.

+0

Avez-vous ajouté le 'Catalogue' pour l'assemblage contenant votre' IClientService'? –

+0

Oui. Cette injection fonctionne bien pour les contrôleurs. Ne fonctionne pas pour l'attribut. –

+0

Avez-vous créé un fournisseur de filtre personnalisé: https://docs.microsoft.com/en-us/aspnet/mvc/overview/older-versions/hands-on-labs/aspnet-mvc-4-dependency-injection? –

Répondre

1

Je face à la même question plus tôt et je fini par utiliser ci-dessous:

private IClientService _ClientService ; 
    public IClientService ClientServiceObj 
    { 
     get 
     { 
      return _ClientService ?? 
        (_ClientService = DependencyResolver.Current.GetService<IClientService>()); 
     } 
     set { _ClientService = value; } 
    } 

Et puis en utilisant ClientServiceObj à ClientService fonctions. J'espère que cela aide.

+1

votre approche va à l'encontre de l'objectif de l'injection de dépendance –

+0

@KhanhTO a raison. Ce que vous faites est exactement le contraire de Dependency Injection. Qu'est-ce que vous faites est appelé Service Location, et c'est [un anti-pattern] (http://blog.ploeh.dk/2010/02/03/ServiceLocatorisanAnti-Pattern/). – Steven