patron inyección inyeccion flyweight ejemplo diseño dependencias c# autofac owin asp.net-web-api2

c# - inyección - inyeccion de dependencias youtube



La inyección de dependencia no funciona con Owin Web-auto-alojado de Owin y Autofac (1)

Debería usar la HttpConfiguration con la que está cargando a OWIN en todas partes. Así que esto:

GlobalConfiguration.Configuration.DependencyResolver = resolver;

Debe convertirse:

config.DependencyResolver = resolver;

Aparte de eso, todo se ve bien. Los controladores Api están registrados, aunque no les está dando un alcance. No estoy seguro si en el alcance de Autofac el valor predeterminado es por solicitud para los controladores o si tiene la noción de alcance por solicitud (sé que LightInject lo tiene).

Mirando alrededor, creo que siguió el ejemplo en el repositorio de Google Code para Autofac, que de hecho usa GlobalConfiguration. En cambio, si nos fijamos en el ejemplo de GitHub , es un poco diferente. Trate de hacer los cambios de acuerdo a esto. Incluyendo esto:

// This should be the first middleware added to the IAppBuilder. app.UseAutofacMiddleware(container);

Actualización 2016

Lo que dije anteriormente todavía se aplica, pero algo extra de los documentos de Autofac (gracias Brad):

Un error común en la integración de OWIN es el uso de GlobalConfiguration.Configuration. En OWIN creas la configuración desde cero. No debe hacer referencia a GlobalConfiguration.Configuration en ningún lugar cuando use la integración OWIN.

Estoy encontrando mis pies con Web Api 2, Owin y Autofac y necesito una guía, por favor.

Visión general
Tengo una Web Api auto hospedada de Owin que utiliza Autofac para IoC e inyección de dependencia. El proyecto es una aplicación de consola que actúa como un servicio, lo que significa que se puede detener e iniciar. Tengo un controlador de autenticación con dos constructores: uno sin parámetros y el otro inyecta un repositorio.

Problema
Cuando ejecuto el servicio y llamo a la API, se llama a mi constructor sin parámetros y nunca se inyecta mi repositorio (_repository = null)

Investigación
He investigado un poco y he encontrado algunos proyectos útiles en Github, que he replicado en el tee pero me falta una gran parte del rompecabezas. This fue útil pero no resolvió mi problema. Leí esta pregunta en Stack Overflow y Dane Sparza tuvo un buen proyecto de demostración, pero no pude encontrar una solución clara. El problema no es el auto-alojamiento sino la inyección de dependencia.

Mi código (diluido para explicación)

public class Startup { public void Configuration(IAppBuilder app) { HttpConfiguration config = new HttpConfiguration(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); var json = config.Formatters.JsonFormatter; json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects; config.Formatters.Remove(config.Formatters.XmlFormatter); var connectioninfo = ConnectionInfo.FromAppConfig("mongodb"); var builder = new ContainerBuilder(); // Create the container builder. builder.RegisterApiControllers(Assembly.GetExecutingAssembly()); // Register the Web API controllers. builder.Register(c => new Logger()).As<ILogger>().InstancePerRequest(); // Register a logger service to be used by the controller and middleware. builder.RegisterType<AuthenticationRepository>().As<IAuthenticationRepository>().WithParameter(new NamedParameter("connectionInfo", connectioninfo)).InstancePerRequest(); var container = builder.Build(); var resolver = new AutofacWebApiDependencyResolver(container); // Create an assign a dependency resolver for Web API to use. GlobalConfiguration.Configuration.DependencyResolver = resolver; // Configure Web API with the dependency resolver app.UseCors(CorsOptions.AllowAll); app.UseWebApi(config); app.UseAutofacWebApi(config); // Make sure the Autofac lifetime scope is passed to Web API. }

Program.cs

static void Main(string[] args) { var service = new ApiService(typeof(Program), args); var baseAddress = "http://localhost:9000/"; IDisposable _server = null; service.Run( delegate() { _server = WebApp.Start<Startup>(url: baseAddress); }, delegate() { if (_server != null) { _server.Dispose(); } } ); }

ApiController

public class AuthenticationController : ApiController { private IAuthenticationRepository _repository; public AuthenticationController() { } public AuthenticationController(IAuthenticationRepository repository) { _repository = repository; } [AllowAnonymous] public IHttpActionResult Authenticate(string name, string password) { if (_repository == null) return BadRequest("User repository is null."); var valid = _repository.AuthenticateUser(name, password); return Ok(valid); } }