2009-06-05 13 views
5

¿Debo hacer algo en la línea de esto? Estoy pensando en todos mis controladores que heredan de BaseController. ¿Rompe esto el patrón de diseño de IoC? ¿Qué más debería hacer en su lugar?Controladores IoC y ASP.NET MVC

public class BaseController: Controller 
{ 
    protected ICookieService CookieService { 
     get { 
      return ServiceResolver.Resolve<ICookieService>(new { HttpContext = HttpContext }); 
     } 
    } 
    protected IDateTimeService DateTimeService { 
     get { 
      return ServiceResolver.Resolve<IDateTimeService>(); 
     } 
    } 
    protected ISettingsService SettingsService { 
     get { 
      return ServiceResolver.Resolve<ISettingsService>(); 
     } 
    } 

} 

Respuesta

10

Sería mucho más simple ir con la inyección de constructor y tener un controllerfactory inyectarlo para usted. Si puede, no use un localizador de servicios (su ServiceResolver) si puede salirse con la inyección del constructor.

Hay algo de información sobre el mismo el Adding a controller factory to ASP MVC

El enlace muestra cómo hacerlo con StructureMap y parece que está utilizando la unidad, pero debe ser fácil de adaptar.

+1

Estoy de acuerdo. Solo debe usar su resolución de tipo en la raíz de su aplicación. Si no es por otra razón que si necesita cambiar los inyectores, no tiene que cambiar todo su código, solo el punto en el que su primer objeto. En mi aplicación, el único lugar que conoce sobre el inyector es Global.asax, e incluso allí lo estoy usando en 1 lugar en demasiados lugares (eso es lo que estoy usando en 2 lugares). Con la inyección del constructor, todo simplemente cae en su lugar y su objeto está aislado de todo. – Talljoe

+0

En realidad estoy usando Castle Windsor pero con un conjunto de interfaces de contenedor para ocultar su complejidad/dependencia. –

+0

¡Gracias por su ayuda! –

0

Supongo que las interfaces protegidas que tiene son dependencias para el controlador. Es posible configurar un contenedor IoC para inyectar las dependencias por usted. Sin duda se puede hacer con Castle Windsor. Debería cambiar su clase BaseController para tener un constructor con las dependencias requeridas, siempre que el contenedor IoC sepa sobre los otros servicios que podrá inyectarlos.

0

Uno de los principios detrás de Inversion of Control y Component-Driven Development se trata de utilizando localizadores de servicios estática sólo cuando no hay otra manera (es decir .: en huéspedes de servicios web o fuentes de datos de objetos).

Técnicamente hablando, utilizando localizadores de servicios estáticos, el controlador base no viola el IoC, simplemente no lo usa.

Consulte existing integration entre Autofac Contenedor IoC y ASP.NET MVC (otros contenedores también deberían poder hacer eso).

Cuestiones relacionadas