ão é possível injetar dependências no controlador de API da Web do ASP.NET usando o Unity

Alguém já teve algum sucesso em executar usando um contêiner de IoC para injetar dependências nos controladores ASP.NET WebAPI? Não consigo fazê-lo funcionar.

Isto é o que estou fazendo agora.

No meuglobal.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;
    }

Minha fábrica de controladores:

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

Parece nunca procurar no meu arquivo de unidade para resolver dependências, e recebo um erro como:

Ocorreu um erro ao tentar criar um controlador do tipo 'PersonalShopper.Services.WebApi.Controllers.ShoppingListController'. Verifique se o controlador possui um construtor público sem parâmetro

o System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create (HttpControllerContext controllerContext, digite controllerType) em System.Web.Http.Dispatcher.DefaultHttpControllerFactory.CreateInstance (HttpControllerContollerHostp). CreateController (HttpControllerContext controllerContext, String controllerName) em System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsyncInternal (solicitação HttpRequestMessage, request CancellationToken cancellationToken) em System.Web.Http.Dispatcher.HttpControllerReportTe

@Controller se parece com:

public class ShoppingListController : System.Web.Http.ApiController
    {
        private Repositories.IProductListRepository _ProductListRepository;


        public ShoppingListController(Repositories.IUserRepository userRepository,
            Repositories.IProductListRepository productListRepository)
        {
            _ProductListRepository = productListRepository;
        }
}

Meu arquivo de unidade se parece com:

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

Observe que eu não tenho um registro para o próprio controlador, porque nas versões anteriores do mvc a fábrica do controlador descobriria que as dependências precisavam ser resolvida

arece que minha fábrica de controladores nunca está sendo chamad

questionAnswers(22)

yourAnswerToTheQuestion