शीर्षक राज्यों के रूप में, मुझे एक वेब एपीआई बाधा वर्ग में एक सेवा इंजेक्ट करने में सक्षम होना चाहिए। मैं अपने सी # वेबएपीआई परियोजना में 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);
}
आप [वेबएपीआई-सरल इंजेक्टर एकीकरण] (https://www.nuget.org/packages/SimpleInjector.Integration.WebApi) पैकेज का उपयोग कर रहे हैं? – vendettamit
हाँ मुझे विश्वास है कि मैं – Gillardo
हूं अगर मैंने सही अनुमान लगाया तो मेरा जवाब जांचें। इसलिए आप SimpleInjector का उपयोग कर रहे हैं लेकिन एक और सहयोगी लाइब्रेरी है जो सरल इंजेक्टर के वेबएपीआई एकीकरण पैकेज के साथ आता है जो वास्तव में वेबएपी संगत कंटेनर प्रदान करके आवश्यक है। – vendettamit