2017-05-01 4 views
0

Es folgt mein MEF Abhängigkeitsauflöserinjizierte Objekt ist immer null in benutzerdefinierten autorisieren 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() 
    { 
    } 

} 

Folgende ist meine Klasse, die ich injizieren wollen.

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

Folgendes ist meine benutzerdefinierte Autorisierung Attribut.

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; 
    } 
} 

Das Objekt ClientService vom Typ IClientService ist immer null. Es scheint, dass der Abhängigkeits-Resolver MEF in diesem Fall die Abhängigkeit für benutzerdefinierte Attribute nicht auflösen kann.

Was ist das eigentliche Problem hier?

Führen Sie mich.

+0

Haben Sie den 'Katalog' für die Assembly hinzugefügt, die Ihren' IClientService' enthält? –

+0

Ja. Diese Injektion funktioniert gut für Controller. Funktioniert nicht für Attribut. –

+0

Haben Sie einen benutzerdefinierten Filteranbieter erstellt: https://docs.microsoft.com/en-us/aspnet/mvc/overview/older-versions/hands-on-labs/aspnet-mvc-4-dependency- injection? –

Antwort

1

stand ich vor dem gleichen Problem früher und ich landete die unter Verwendung von:

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

Und dann ClientServiceObj mit Funktionen ClientService. Hoffe, das hilft.

+1

Ihr Ansatz besiegt den Zweck der Abhängigkeit Injektion –

+0

@KhanhTO hat Recht. Was Sie tun, ist das genaue Gegenteil von Dependency Injection. Was Sie tun, heißt Service Location, und es ist [ein Anti-Pattern] (http://blog.ploeh.dk/2010/02/03/ServiceLocatorisanAnti-Pattern/). – Steven