8

Nie mogę uzyskać wtyczki zależnej działającej z niestandardową klasą ActionFilterAttribute przy użyciu narzędzia Unity bootstrapper dla ASP.NET Web Pakiet API nuget.Nie można wstrzykiwać w System.Web.Http.Filters.ActionFilterAttribute za pomocą programu Unity bootstrapper dla pakietu ASP.NET Web API nuget

Zarejestrowałem typ w UnityConfig i używam go gdzie indziej (używając tam jednak iniekcji konstruktora) i działa dobrze.

public static void RegisterTypes(IUnityContainer container) 
{ 
    container.RegisterType<ISettingService, SettingService>(); 
    ... 
} 

Kod jest wywoływany pomyślnie, jednak instancjonowany obiekt (usugaService) ma wartość null.

public class APIKeyValidationAttribute : ActionFilterAttribute 
{ 
    [Dependency] 
    public ISettingService settingService { get; set; } 

public override void OnActionExecuting(HttpActionContext actionContext) 
{ 
    ... 
    if (settingService == null) 
    { 
     throw new Exception("settingService is null"); 
    } 
    ... 
} 

Co muszę zrobić, aby to zadziałało? Długo szukałem i mogę znaleźć przykłady MVC lub Web API z różnymi wtryskiwaczami zależności.

Odpowiedz

8

najpierw utworzyć IFilterProvider że wykona gromadzeniu i wstrzyknąć współzależności:

public class UnityActionFilterProvider 
    : ActionDescriptorFilterProvider, IFilterProvider 
{ 
    private readonly IUnityContainer container; 

    public UnityActionFilterProvider(IUnityContainer container) 
    { 
     this.container = container; 
    } 

    public new IEnumerable<FilterInfo> GetFilters(
     HttpConfiguration configuration, 
     HttpActionDescriptor actionDescriptor) 
    { 
     var filters = base.GetFilters(configuration, actionDescriptor); 

     foreach (var filter in filters) 
     { 
      container.BuildUp(filter.Instance.GetType(), filter.Instance); 
     } 

     return filters; 
    } 
} 

Następnie zarejestrować IFilterProvider:

private static void RegisterFilterProviders() 
{ 
    var providers = 
     GlobalConfiguration.Configuration.Services.GetFilterProviders().ToList(); 

    GlobalConfiguration.Configuration.Services.Add(
     typeof(System.Web.Http.Filters.IFilterProvider), 
     new UnityActionFilterProvider(UnityConfig.GetConfiguredContainer())); 

    var defaultprovider = providers.First(p => p is ActionDescriptorFilterProvider); 

    GlobalConfiguration.Configuration.Services.Remove(
     typeof(System.Web.Http.Filters.IFilterProvider), 
     defaultprovider); 
} 

umieścić tę metodę i powoływać go w klasie UnityWebApiActivator.

+0

Dzięki stosy Tuzo. Stworzyłem nową klasę, dodałem metodę RegisterFilterProviders do klasy UnityWebApiActivator add dodano przestrzeń nazw dla nowej klasy. Ten błąd jest generowany "System.Collections.Generic.IEnumerable " nie zawiera definicji "ToList" i metody rozszerzenia "ToList" akceptującej pierwszy argument typu "System.Collections" .Generic.Inumerable "można znaleźć (czy brakuje dyrektywy użycia lub odwołania do zestawu?) Czy istnieją inne przestrzenie nazw, które muszę dodać? –

+0

@MichaelS: 'ToList()' jest metodą rozszerzenia w 'System.Linq'. Dodaj 'using System.Linq;' do górnej części pliku, aby rozwiązać ten błąd kompilacji. –

+0

Dzięki temu zadziałało dobrze. Z jakiegoś powodu po kliknięciu prawym przyciskiem nie było opcji "Rozwiąż". –

Powiązane problemy