8

ASP.NET Web için Unity önyükleyicisini kullanarak özel bir ActionFilterAttribute sınıfı ile bağımlılık enjeksiyonu yapamıyorum API nuget paketi.System.Web.Http.Filters.ActionFilterAttribute, ASP.NET Web API nuget paketi için Unity bootstrapper kullanarak enjekte edilemiyor

UnityConfig türünü kaydettim ve başka bir yerde kullanıyorum (burada yapıcı yerleştirme kullanarak) ve iyi çalışıyor.

Kod başarıyla çağrılıyor, ancak örneklenen nesne (settingService) boş.

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"); 
    } 
    ... 
} 

Bu çalışma için ne yapmam gerekiyor? Uzun zamandır aradığım ve farklı bağımlılık enjektörleri ile sadece MVC veya Web API için örnekler bulabilirsiniz.

cevap

8

İlk bağımlılıkları birikmesi gerçekleştirmek ve enjekte edecek bir IFilterProvider oluşturun:

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

Sonra IFilterProvider kayıt:

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

Ben bu yöntemi koymak ve UnityWebApiActivator sınıfta çağrılan.

+0

Teşekkürler yığınları Tuzo. Yeni bir sınıf oluşturdum, UnityWebApiActivator sınıfına RegisterFilterProviders yöntemini ekledim ve yeni sınıf için ad alanı ekledim. Bu hata üretilir 'System.Collections.Generic.IEnumerable ' 'ToList' için bir tanım içermez ve 'System.Collections türünün ilk argümanını kabul eden' ToList 'uzantı yöntemi yok .Generic.IEnumerable 'bulunamadı (bir yönerge veya bir montaj başvurusu kullanarak eksik misiniz?). Eklemem gereken başka ad alanları var mı? –

+0

@MichaelS: 'ToList()' 'System.Linq' içinde bir uzantı yöntemidir. Bu derleme hatasını gidermek için dosyanızın üstüne System.Linq; 'kullanarak ekleyin. –

+0

Teşekkürler iyi çalıştı. Bazı sebeplerden dolayı sağ tıkladığımda "Resolve" seçeneği yoktu. –