simpleinjector simple mvc injector injection dependency c# .net ioc-container simple-injector

mvc - simpleinjector c#



¿Simple Injector soporta MVC 4 ASP.NET Web API? (2)

Soy nuevo en el contenedor de IOC Simple Injector. Comenzaré a trabajar en un proyecto que requerirá una implementación MVC de ASP.NET de varios tenedores utilizando MVC 4 ASP.NET Web API.

Mi pregunta es: ¿El inyector simple es compatible con MVC 4 ASP.NET Web API? La lectura de documentación de inyector simple como this hace referencias a MVC 3 y me gustaría saber si MVC 4 también es compatible.


¿El inyector simple IOC es compatible con MVC 4 ASP.NET Web API?

Actualmente no tiene soporte para MVC4 Web API, pero se agregará en el futuro. La guía de integración se actualizará cuando esto suceda.

ACTUALIZACIÓN : Se ha agregado compatibilidad con la API web a Simple Injector 2.5.

Mientras tanto, puede crear su propia implementación System.Web.Http.Dependencies.IDependencyResolver para el Simple Injector. A continuación se muestra la implementación para trabajar con la API web en un entorno alojado en IIS:

public class SimpleInjectorHttpDependencyResolver : System.Web.Http.Dependencies.IDependencyResolver { private readonly Container container; public SimpleInjectorHttpDependencyResolver( Container container) { this.container = container; } public System.Web.Http.Dependencies.IDependencyScope BeginScope() { return this; } public object GetService(Type serviceType) { IServiceProvider provider = this.container; return provider.GetService(serviceType); } public IEnumerable<object> GetServices(Type serviceType) { IServiceProvider provider = this.container; Type collectionType = typeof(IEnumerable<>).MakeGenericType(serviceType); var services =(IEnumerable<object>)this.ServiceProvider.GetService(collectionType); return services ?? Enumerable.Empty<object>(); } public void Dispose() { } }

Esta implementación no implementa ningún alcance, ya que necesita usar el tiempo de vida de la Solicitud de API por Web para implementar el alcance dentro de un entorno alojado en la web (donde una solicitud puede terminar en un hilo diferente al de donde comenzó).

Debido a la forma en que se diseñó la API web , es muy importante registrar explícitamente todos los controladores de la API web. Puedes hacerlo usando el siguiente código:

var services = GlobalConfiguration.Configuration.Services; var controllerTypes = services.GetHttpControllerTypeResolver() .GetControllerTypes(services.GetAssembliesResolver()); foreach (var controllerType in controllerTypes) { container.Register(controllerType); }

Puede registrar el SimpleInjectorHttpDependencyResolver siguiente manera:

// NOTE: Do this as last step, after registering the controllers. GlobalConfiguration.Configuration.DependencyResolver = new SimpleInjectorHttpDependencyResolver(container);


La respuesta corta es: sí, funciona. A continuación se muestra el fragmento de código que funciona para mi proyecto con la API web y los controladores MVC4 (parcialmente basado en la respuesta de Steven anterior):

var container = new Container(); //Register you types in container here container.RegisterMvcControllers(Assembly.GetExecutingAssembly()); container.RegisterMvcAttributeFilterProvider(); var controllerTypes = from type in Assembly.GetExecutingAssembly().GetExportedTypes() where typeof(ApiController).IsAssignableFrom(type) where !type.IsAbstract where !type.IsGenericTypeDefinition where type.Name.EndsWith("Controller", StringComparison.Ordinal) select type; foreach (var controllerType in controllerTypes) { container.Register(controllerType); } container.Verify(); DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));

Para acceder a sus tipos en los controladores API, puede usar el siguiente fragmento de código:

DependencyResolver.Current.GetService<InterfaceName>()