क्या किसी को ASP.NET WebAPI नियंत्रकों में निर्भरता को इंजेक्ट करने के लिए IoC कंटेनर का उपयोग करके कोई सफलता मिली है? मैं इसे काम करने के लिए प्राप्त करने के लिए प्रतीत नहीं कर सकता।
यही मैं अभी कर रहा हूं।
मेरे में global.ascx.cs
:
public static void RegisterRoutes(RouteCollection routes)
{
// code intentionally omitted
}
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
IUnityContainer container = BuildUnityContainer();
System.Web.Http.GlobalConfiguration.Configuration.ServiceResolver.SetResolver(
t =>
{
try
{
return container.Resolve(t);
}
catch (ResolutionFailedException)
{
return null;
}
},
t =>
{
try
{
return container.ResolveAll(t);
}
catch (ResolutionFailedException)
{
return new System.Collections.Generic.List<object>();
}
});
System.Web.Mvc.ControllerBuilder.Current.SetControllerFactory(new UnityControllerFactory(container));
BundleTable.Bundles.RegisterTemplateBundles();
}
private static IUnityContainer BuildUnityContainer()
{
var container = new UnityContainer().LoadConfiguration();
return container;
}
मेरा नियंत्रक कारखाना:
public class UnityControllerFactory : DefaultControllerFactory
{
private IUnityContainer _container;
public UnityControllerFactory(IUnityContainer container)
{
_container = container;
}
public override IController CreateController(System.Web.Routing.RequestContext requestContext,
string controllerName)
{
Type controllerType = base.GetControllerType(requestContext, controllerName);
return (IController)_container.Resolve(controllerType);
}
}
यह निर्भरता को हल करने के लिए मेरी एकता फ़ाइल में कभी नहीं लगता है, और मुझे एक त्रुटि मिलती है:
'PersonalShopper.Services.WebApi.Controllers.hoppingListController' का नियंत्रक बनाने का प्रयास करते समय एक त्रुटि हुई। सुनिश्चित करें कि नियंत्रक के पास एक पैरामीटर रहित सार्वजनिक निर्माता है।
System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create (HttpControllerContext कंट्रोलर कंट्रोलटेक्स्ट, टाइप कंट्रोलर टाइप करें) System.Web.Http.Dispatcher.DefaultHttpControllerFactory.Create (रूटर)। (HttpControllerContext नियंत्रकContext, String कंट्रोलरनाम) System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsyncInternal (HttpRequestMessage अनुरोध पर, रद्द कर दिया गया है।
नियंत्रक जैसा दिखता है:
public class ShoppingListController : System.Web.Http.ApiController
{
private Repositories.IProductListRepository _ProductListRepository;
public ShoppingListController(Repositories.IUserRepository userRepository,
Repositories.IProductListRepository productListRepository)
{
_ProductListRepository = productListRepository;
}
}
मेरी एकता फ़ाइल इस प्रकार है:
<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
<container>
<register type="PersonalShopper.Repositories.IProductListRepository, PersonalShopper.Repositories" mapTo="PersonalShopper.Implementations.MongoRepositories.ProductListRepository, PersonalShopper.Implementations" />
</container>
</unity>
ध्यान दें कि मेरे पास स्वयं नियंत्रक के लिए पंजीकरण नहीं है क्योंकि mvc के पिछले संस्करणों में नियंत्रक कारखाना यह पता लगाएगा कि निर्भरता को हल करने की आवश्यकता है।
ऐसा लगता है जैसे मेरे नियंत्रक कारखाने को कभी नहीं बुलाया जा रहा है।
GlobalConfiguration.Configuration.ServiceResolver.SetResolver()
?