5

शीर्षक राज्यों के रूप में, मुझे एक वेब एपीआई बाधा वर्ग में एक सेवा इंजेक्ट करने में सक्षम होना चाहिए। मैं अपने सी # वेबएपीआई परियोजना में SimpleInjector का उपयोग कर रहा हूँ।आप एक वेब एपीआई IHttpRouteConstraint में इंजेक्ट कैसे कर सकते हैं?

मेरी webApiConfig.cs में मैं मैं अपने बाधा में IDynamicRouteService इंजेक्षन करने की जरूरत है इस

// add constraint resolvers 
var constraintResolver = new DefaultInlineConstraintResolver(); 
constraintResolver.ConstraintMap.Add("dynamicName", typeof(DynamicRouteConstraint)); 

// routing 
config.MapHttpAttributeRoutes(constraintResolver); 

मेरे कस्टम contraint इस

public class DynamicRouteConstraint : IHttpRouteConstraint 
{ 
    private IDynamicRouteService _service; 

    public DynamicRouteConstraint(IDynamicRouteService service) 
    { 
     _service = service; 
    } 

    public bool Match(System.Net.Http.HttpRequestMessage request, IHttpRoute route, string parameterName, IDictionary<string, object> values, HttpRouteDirection routeDirection) 
    { 
     return _service.Match(values[parameterName].ToString()); 
    } 
} 

तरह लग रहा है आप देख सकते हैं है। वर्तमान में मेरा आवेदन

इस ऑब्जेक्ट के लिए कोई पैरामीटर रहित कन्स्ट्रक्टर परिभाषित नहीं किया गया है।

लेकिन मुझे पैरामीटर रहित कन्स्ट्रक्टर नहीं चाहिए क्योंकि मुझे इंजेक्शन की आवश्यकता है।

मैं पहले ही अपनी सभी वर्गों

container.RegisterWebApiRequest<IDynamicRouteService, DynamicRouteService>(); 

सुई और मुझे वास्तविक सेवा है जो इंटरफेस को लागू करता है बनाया है मेरी SimpleInjectorConfig फ़ाइल, जहां मैं रजिस्टर में इस लाइन को शामिल किया है, यहाँ यह है (नीचे संस्करण में कटौती)

public class DynamicRouteService : IDynamicRouteService 
{ 
    private IModuleService _service; 

    public DynamicRouteService(IModuleService service) 
    { 
     _service = service; 
    } 

    public ICollection<DynamicRouteModel> GetRoutes() 
    { 
     var list = new List<DynamicRouteModel>(); 

     // custom code usually here 

     return list; 
    } 

    public void Clear() 
    { 
     // custom code usually here 
    } 

    public bool Match(string name) 
    { 
     // custom code usually here 
     return false; 
    } 

} 

के रूप में यह ठीक काम कर रहा है इंजेक्शन की जा रही मेरी IModuleService सेवा के साथ गलत कुछ भी नहीं है, मैं सिर्फ मेरी बाधा में IDynamicRouteService इंजेक्षन करने में सक्षम होने की जरूरत है।

किसी भी मदद की सराहना की

संपादित

यहाँ मेरे वर्तमान SimpleInjector रजिस्टर विधि

public static Container Register(HttpConfiguration apiConfig) 
{ 
    var container = new Container(); 

    container.RegisterPerWebRequest<HttpContextBase>(() => new HttpContextWrapper(HttpContext.Current)); 
    container.RegisterPerWebRequest<HttpConfiguration>(() => apiConfig); 

    // EnableHttpRequest and IDynamicNameService are needed to get the name of the module 
    // that is requested via the DynamicDataController 
    container.EnableHttpRequestMessageTracking(apiConfig); 
    container.RegisterWebApiRequest<IDynamicModuleService, DynamicRouteService>(); 

    // service for dynamicRoute checking 
    container.Register<IDynamicRouteService, DynamicRouteService>(); 

    // This is an extension method from the integration package. 
    container.RegisterWebApiControllers(apiConfig); 

    container.RegisterMvcControllers(Assembly.GetExecutingAssembly()); 

    container.Verify(); 

    DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container)); 

    apiConfig.DependencyResolver = new SimpleInjectorWebApiDependencyResolver(container); 

    return container; 
} 

है और मेरे startup.cs फ़ाइल

public void Configuration(IAppBuilder app) 
{ 
    // This is a self hosted webapi project.. 
    HttpConfiguration apiConfig = new HttpConfiguration(); 

    // confgi oauth 
    OAuthConfig.Register(app); 

    // simple injector 
    var container = SimpleInjectorConfig.Register(apiConfig); 

    AutoMapperConfig.RegisterMappings(); 
    AreaRegistration.RegisterAllAreas(); 
    WebApiConfig.Register(apiConfig, container); 
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
    RouteConfig.RegisterRoutes(RouteTable.Routes); 
    BundleConfig.RegisterBundles(BundleTable.Bundles); 

    app.UseWebApi(apiConfig); 
} 
+0

आप [वेबएपीआई-सरल इंजेक्टर एकीकरण] (https://www.nuget.org/packages/SimpleInjector.Integration.WebApi) पैकेज का उपयोग कर रहे हैं? – vendettamit

+0

हाँ मुझे विश्वास है कि मैं – Gillardo

+0

हूं अगर मैंने सही अनुमान लगाया तो मेरा जवाब जांचें। इसलिए आप SimpleInjector का उपयोग कर रहे हैं लेकिन एक और सहयोगी लाइब्रेरी है जो सरल इंजेक्टर के वेबएपीआई एकीकरण पैकेज के साथ आता है जो वास्तव में वेबएपी संगत कंटेनर प्रदान करके आवश्यक है। – vendettamit

उत्तर

3

अद्यतन:

तो मैं DefaultInlineConstraintResolver वर्ग के कार्यान्वयन की समीक्षा में पाया कि इस वर्ग के कंटेनर समाधानकर्ता लेकिन उदाहरण बनाने के लिए उत्प्रेरक वर्ग जिसका उपयोग करके आप डिफ़ॉल्ट निर्माता के कारण समस्या हो सकती उपयोग नहीं करता है उदाहरण।

आईएमओ आपको IInlineConstraintResolver के लिए कस्टम कार्यान्वयन करने की आवश्यकता हो सकती है या डायनेमिक रूट कॉन्स्ट्रेन कन्स्ट्रक्टर से पैरामीटर IDynamicRouteService को निकालने की आवश्यकता हो सकती है और इंस्टेंस फॉर्म अन्य माध्यमों को प्रारंभ किया जा सकता है।

+0

धन्यवाद! उत्तर अपडेट किया गया। – vendettamit

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