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.
Haben Sie den 'Katalog' für die Assembly hinzugefügt, die Ihren' IClientService' enthält? –
Ja. Diese Injektion funktioniert gut für Controller. Funktioniert nicht für Attribut. –
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? –