2011-10-05 15 views

Respuesta

9

Hay un expample de vista de la inyección en un blog por Brad Wilson http://bradwilson.typepad.com/blog/2010/07/service-location-pt3-views.html

Las declaraciones de los otros que permiten vistas inyección de constructor no es del todo correcta. Sí IDependencyResolver permite crear vistas que tienen argumentos de constructor. Pero a menos que esté implementando su propio motor de vista esto no lo ayudará en absoluto. Los motores de visualización existentes como la afeitadora requerirán que tenga un constructor sin parámetros. Esto significa que solo puede hacer inyecciones de propiedad en vistas con ellos.

Pero como los demás dijeron que no debería ver la inyección de todos modos. Su vista debe ser tonta y simplemente renderizar el modelo de vista a HTML. Todo lo que requiera una dependencia se debe hacer en el controlador o un servicio.

+0

¿Qué sucede si tiene una autorización personalizada que desea poder usar como propiedad de la vista? (para especificar ciertas partes que no se deben procesar en una afeitadora sin los permisos requeridos) –

4

Sí, es posible, pero realmente creo que no es una buena idea. ¿Por qué necesitarías algunos "servicios" en el nivel de vista? Recuerde la guía clave MVC - una vista debe ser tonta. De hecho, debería ser solo un tipo de plantilla para la transformación del objeto de modelo de vista a HTML, nada más.

+0

Buen punto. Debería estar inyectando servicios en el "Controlador", no en la vista. – Steven

+5

i18n traducciones dentro de la vista. Ver contiene las claves y simplemente tira de la traducción correcta. No hay razón por la que eso no pueda estar en la vista. – BradLaney

+2

¿Qué tal un servicio de localización o tipo de configuración que solo contiene texto? Técnicamente aún son tontos –

7

No es posible realizar constructor inyección. Pero se puede hacer algo como esto con, por ejemplo, Ninject:

 
    public abstract class CustomViewBase<TModel> : WebViewPage<TModel> where TModel : class 
    { 
     [Inject] 
     public IFace Face 
     { 
      get; 
      set; 
     } 
    } 

y suponiendo que haya configurado IDependencyResolver en Global.asax usted debe tener correctamente la propiedad @Face inicializado. Pero una advertencia importante: no puede acceder a @Face en _Layout.cshtml, porque (según Brad Wilson) Layout funciona fuera de MVC, y @Face será nulo cuando intente acceder a él en la página de diseño.

En cualquier caso, estoy de acuerdo con los demás en que la vista no debería tener que lidiar con ninguna lógica compleja.

+1

¡ESTO ES INCREÍBLE! No me di cuenta de que podías hacer eso con Ninject. –

+0

No tiene que ser ninject tampoco. Autofac y otros harán lo mismo, sin necesidad del decorador. –

+0

Funcionó bien en páginas heredadas. Pero, ¿cuál es la solución para acceder a los mismos métodos de clase inyectados dentro del diseño (página maestra) en MVC? –

Cuestiones relacionadas