tag route net for data asp all asp.net-mvc ioc-container structuremap

asp.net mvc - route - Usando IoC en métodos de extensión



tag helpers asp net core (3)

NO debe llamar a structuremap directamente en su método de extensión. Además, debe crear una versión comprobable que tome un argumento IPerformanceService como el siguiente:

public static class ShowUrl { public static string ForShow(this UrlHelper url, int showId) { //Use the MVC DependencyResolver NOT Structuremap directly (DependencyResolver is using structuremap) return url.ForShow(showId, DependencyResolver.Current.GetService<IPerformanceService>()) } //For Unit Testing public static string ForShow(this UrlHelper url, int showId, IPerformanceService performanceService) { var showName = performanceService.GetPerformanceTitle(showId); return url.Action(MVC.Performance.Details(showId, showName.ToFriendlyUrl())); } }

Ahora puede pasar una implementación concreta de IPerformanceService en su método de prueba de unidad.

Assert.Equal("TheUrl", url.ForShow(8, new PerformanceService());

Más información sobre burlones de UrlHelper: ASP.NET MVC: controladores de prueba unitaria que usan UrlHelper

Estoy trabajando en una aplicación ASP MVC 3 y estoy escribiendo un ayudante html personalizado. No es nada especial o muy complejo, pero necesitará una instancia de una interfaz desde el mapa de estructura. Sé que puedo llamar a la fábrica de objetos de structuremaps desde dentro del método, pero como el resto de la aplicación usa IoC en lugar de la ubicación del servicio, me gustaría que siga siendo así.

¿Hay una manera de inyectar interfaces en los métodos de extensión desde adentro y asp net mvc?

ACTUALIZAR

Un ejemplo de lo que estoy haciendo podría ayudar:

public static class ShowUrl { public static string ForShow(this UrlHelper url, int showId) { var service = ObjectFactory.GetInstance<IPerformanceService>(); var showName = service.GetPerformanceTitle(showId); return url.Action(MVC.Performance.Details(showId, showName.ToFriendlyUrl())); } }

Que se usa así:

<a href=''<%= Url.ForShow(1)%>''>

Esencialmente, estoy tratando de construir una URL con un slug desde un ID de entidad. Tal vez solo estoy haciendo esto de una manera realmente tonta.


No hay forma de inyectar dependencias en un método de extensión.

Para los ayudantes de ASP.NET MVC, tendrá que hacer algún tipo de ubicación de servicio, ya sea que lo entierre con algún tipo de abstracción.


No recomendaría hacer esto. Los métodos de extensión generalmente se utilizan mejor para operaciones simples y conocidas directamente en un tipo. Si su método de extensión depende de tener una instancia de otro tipo, es probable que para empezar no sea un método de extensión.

Considere crear una clase de servicio real que realice esta funcionalidad e inyectarla donde sea necesaria. Si realmente necesita esto en un método de extensión, considere incluir la funcionalidad que su método de extensión requiere en otra clase / método estático, y evite usar cualquier tipo de inyección o ubicación.

Compartir algún código podría arrojar más luz sobre su situación específica.