8

के लिए यूनिटी बूटस्ट्रैपर का उपयोग कर System.Web.Http.Filters.ActionFilterAttribute पर इंजेक्ट नहीं कर सकता है I ASP.NET वेब के लिए एकता बूटस्ट्रैपर का उपयोग कर कस्टम एक्शनफ़िल्टर एट्रिब्यूट क्लास के साथ काम कर रहे निर्भरता इंजेक्शन नहीं प्राप्त कर सकता एपीआई nuget पैकेज।ASP.NET वेब एपीआई nuget पैकेज

मैंने यूनिटी कॉन्फिग में टाइप पंजीकृत किया है और मैं इसे कहीं और उपयोग कर रहा हूं (हालांकि कन्स्ट्रक्टर इंजेक्शन का उपयोग कर रहा हूं) और यह ठीक काम करता है।

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

कोड सफलतापूर्वक कहा जा रहा है, हालांकि तत्काल ऑब्जेक्ट (सेटिंग सेवा) शून्य है।

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

मुझे यह काम करने के लिए क्या करने की ज़रूरत है? मैं लंबे समय से खोज कर रहा हूं और एमवीसी के लिए या विभिन्न निर्भरता इंजेक्टरों के साथ वेब एपीआई के लिए उदाहरण पा सकते हैं।

उत्तर

8

पहले एक IFilterProvider है कि एक निर्माण करते हैं और निर्भरता इंजेक्षन जाएगा बनाने के लिए:

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

फिर 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); 
} 

मैं इस विधि डाल दिया और UnityWebApiActivator कक्षा में यह लागू।

+0

धन्यवाद ढेर तुज़ो। मैंने एक नई कक्षा बनाई है, UnityWebApiActivator क्लास में RegisterFilterProviders विधि को जोड़ा गया है, नई कक्षा के लिए नामस्थान जोड़ा गया है। यह त्रुटि 'System.Collections.Generic.IEnumerable ' में 'ToList' की परिभाषा नहीं है और 'एक्सटेंशन' प्रकार का पहला तर्क स्वीकार करने के लिए 'ToList' कोई परिभाषा नहीं है। सिस्टम। चयन .Generic.IEumerable 'पाया जा सकता है (क्या आप एक प्रयोग निर्देश या असेंबली संदर्भ खो रहे हैं?) क्या कोई अन्य नामस्थान है जिसमें मुझे जोड़ने की आवश्यकता है? –

+0

@MichaelS: 'ToList()' 'System.Linq' में एक विस्तार विधि है। उस संकलन त्रुटि को हल करने के लिए अपनी फ़ाइल के शीर्ष पर 'System.Linq;' का उपयोग करके जोड़ें। –

+0

धन्यवाद कि ठीक काम किया। किसी कारण से जब मैंने सही क्लिक किया तो "समाधान" विकल्प नहीं था। –

संबंधित मुद्दे