unity tutorial net mvc injection dependency container asp c# asp.net-web-api dependency-injection inversion-of-control unity-container

c# - tutorial - Unity.WebApi | Asegúrese de que el controlador tenga un constructor público sin parámetros



unity container asp net mvc (3)

Estoy usando el paquete Unity.WebApi NuGet (Unity 4.0.1 y Unity.WebApi 5.2.3) en una solución ASP.NET WebApi. El problema al que me enfrento es que cuando intento ejecutar el código, obtengo el error: Make sure that the controller has a parameterless public constructor . He buscado hilos similares aquí, pero no he podido encontrar ningún hilo que coincida con mi problema.

No digas "Agregar un constructor sin parámetros" porque muestra que obviamente no tienes ni idea de qué es IoC y por qué esa afirmación no tiene ningún sentido y derrota el propósito de IoC. Digo esto porque vi esto en muchos de los otros hilos que he visto hasta ahora.

Este es mi Startup.cs (estoy usando Owin, entonces no tengo Global.asax):

public void Configuration(IAppBuilder app) { var config = new HttpConfiguration(); config.MapHttpAttributeRoutes(); // Registering unity stuff UnityConfig.RegisterComponents(); app.UseWebApi(config); }

Este es mi UnityConfig.cs:

public static class UnityConfig { public static void RegisterComponents() { var container = new UnityContainer(); // Register controller container.RegisterType<MyController>(); // Register interface container.RegisterType<IService, Service>(); GlobalConfiguration.Configuration.DependencyResolver = new UnityDependencyResolver(container); } }

Este es mi controlador de API:

public class MyController : ApiController { private IService service public MyController(IService service) { this.service = service; } public IHttpActionResult Get() { return Ok("All systems go!"); } }

EDITAR

Retiré las declaraciones de uso porque las personas están teniendo dificultades para entender que el problema ocurre independientemente de si las instrucciones de uso están allí.


En mi experiencia, hay 2 escenarios diferentes cuando esto ocurre.

1. Asegúrese de que todos los parámetros en el constructor del Service puedan ser resueltos. ¿Tiene alguna dependencia que no haya registrado?

Asegúrese de que el controlador tenga un constructor público sin parámetros en Unity

2. Asegúrese de registrar Unity con la API web. Al igual que:

public static class WebApiConfig { public static void Register(HttpConfiguration config) { // Routes and other stuff here... var container = IocContainer.Instance; // Or any other way to fetch your container. config.DependencyResolver = new UnityDependencyResolver(container); } }

Ejemplos aquí:

Inyectando dependencia en el controlador de la API web

http://codeclimber.net.nz/archive/2015/02/20/Using-Entity-Framework-within-an-Owin-hosted-Web-API-with.aspx

EDIT 1:

Como @ NightOwl888 mencionado en los comentarios, no debe tirar el contenedor. Los registros se registran en el contenedor, y cuando el contenedor se elimina, no sabrá cómo resolver las dependencias. Puede provocar el error que está viendo.

EDICION 2:

Ya que estás usando Owin, deberías ser capaz de hacer algo como esto:

public void Configuration(IAppBuilder appBuilder) { // Configure Web API for self-host. HttpConfiguration config = new HttpConfiguration(); config.DependencyResolver = new UnityDependencyResolver( UnityConfig.GetConfiguredContainer()); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); appBuilder.UseWebApi(config); }

Y actualice su UnityConfig a esto:

public static class UnityConfig { public static IUnityContainer GetConfiguredContainer() { var container = new UnityContainer(); // Register controller container.RegisterType<MyController>(); // Register interface container.RegisterType<IService, Service>(); //This is done in Startup instead. //GlobalConfiguration.Configuration.DependencyResolver = new UnityDependencyResolver(container); return container; } }

De esta fuente: Cómo usar el contenedor DI cuando OwinStartup

http://damienbod.com/2013/10/01/self-host-webapi-with-owin-and-unity/

En este método, HttpConfiguration.DependencyResolver se establece en una instancia de UnityDependencyResolver. Esto es necesario para que la inyección contructor se pueda utilizar en los controladores webApi. La clase UnityDependencyResolver es exactamente la misma que la clase Unity.WebApi.UnityDependencyResolver. No se usa Unity.WebApi porque esta es una aplicación OWIN alojada en uno mismo.


Establezca DependencyResolver en HttpConfiguration que creó al inicio, no en GlobalConfiguration.Configuration y asegúrese de que todos sus servicios sean públicos, espero que esto ayude


Asegúrese de que los tipos anidados que también se inyectan se resuelvan correctamente. Obtendrá un mensaje de error en el nivel del controlador incluso si los tipos anidados se resuelven incorrectamente.