Czy ktoś odniósł jakikolwiek sukces, używając kontenera IoC do wstrzykiwania zależności do kontrolerów ASP.NET WebAPI? Nie wydaje mi się, żeby to działało.
To właśnie teraz robię.
W moim 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;
}
Moja fabryka kontrolerów:
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);
}
}
Wydaje się, że nigdy nie zagląda do mojego pliku unity, aby rozwiązać zależności, i otrzymuję błąd taki jak:
Wystąpił błąd podczas próby utworzenia kontrolera typu „PersonalShopper.Services.WebApi.Controllers.ShoppingListController”. Upewnij się, że kontroler ma konstruktora publicznego bez parametrów.
at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create (HttpControllerContext controllerContext, Type controllerType) w System.Web.Http.Dispatcher.DefaultHttpControllerFactory.CreateInstance (HttpControllerContext controllerContext, Type controllerType) w System.Web.Http.Dispatcher.DefaultHttpControllerFactory.CreateInstance (HttpControllerContext controllerContext, HttpContrcripateController) (HttpControllerContext controllerContext, String controllerName) w System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsyncInternal (HttpRequestMessage request, CancellationToken cancellationToken) w System.Web.Http.Dispatcell.HttpContrendollerAsyncInternal (HttpRequestMessage request, CancellationToken cancellationToken) w System.Web.Http.Dispatcell.HttpContrendól
Kontroler wygląda następująco:
public class ShoppingListController : System.Web.Http.ApiController
{
private Repositories.IProductListRepository _ProductListRepository;
public ShoppingListController(Repositories.IUserRepository userRepository,
Repositories.IProductListRepository productListRepository)
{
_ProductListRepository = productListRepository;
}
}
Mój plik Unity wygląda następująco:
<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>
Zauważ, że nie mam rejestracji samego kontrolera, ponieważ w poprzednich wersjach MVC fabryka kontrolerów zorientowała się, że zależności wymagają rozwiązania.
Wygląda na to, że nigdy nie dzwoniono do mojej fabryki kontrolerów.
GlobalConfiguration.Configuration.ServiceResolver.SetResolver()
?