2011-10-12 6 views
6

Mi página base Aspecto:Tipo de página de base personalizada para mis vistas de maquinilla de afeitar, ¿cómo usar windsor de castillo para autoaumentar las propiedades?

namespace ASDF.Mvc.ViewEngines.Razor 
{ 
    public abstract class WebViewPage<TModel> : System.Web.Mvc.WebViewPage<TModel> 
    { 

     public ISomeHelper SomeHelper { get; set; } 
    } 
} 

Mis puntos de vista/web.config

<system.web.webPages.razor> 
    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> 
    <pages pageBaseType="ASDF.Mvc.ViewEngines.Razor.WebViewPage"> 
     <namespaces> 
     <add namespace="System.Web.Mvc" /> 
     <add namespace="System.Web.Mvc.Ajax" /> 
     <add namespace="System.Web.Mvc.Html" /> 
     <add namespace="System.Web.Routing" /> 
     </namespaces> 
    </pages> 
    </system.web.webPages.razor> 

¿Cómo puedo tener este cableado de tal manera que SomeHelper se conectará usando Castillo.

Esto está volviendo nulo en este momento, He cableado ISomeHelper ya y las cosas funcionan bien para mis controladores/repositorios/clases de servicio.

Supongo que este WebViewPage se llama en algún lugar donde mi contenedor no tiene acceso (como en el nivel de controlador).

¿Cómo hago para que funcione?

Respuesta

9

Lo primero acerca de la inyección de dependencias en páginas web personalizadas como esta es que no puede usar la inyección de constructor. Es una pena y espero que mejoren esto en futuras versiones. El motivo es que la clase real que implementa esto es emitida dinámicamente en tiempo de ejecución por el motor ASP.NET.

Así que solo podemos usar la inyección de propiedad en este momento.

Así que una posibilidad es usar un IDependencyResolver personalizado. Desafortunadamente IDependencyResolver doesn't play nice with Castle Windsor. Hubiera sido pan comido con Ninject, por ejemplo. Todo lo que tendría que hacer es decorar la propiedad SomeHelper con el atributo [Inject]:

[Inject] 
public ISomeHelper SomeHelper { get; set; } 

y que habría sido atado con alambre automáticamente por Ninject ya que utiliza una IDependencyResolver personalizado. Me temo que con Windsor tendrás que hacer esto manualmente. Por lo que podría hacer que su público recipiente en Global.asax y luego:

public abstract class WebViewPage<TModel> : System.Web.Mvc.WebViewPage<TModel> 
{ 
    protected WebViewPage() 
    { 
     SomeHelper = MvcApplication.WindsorContainer.Resolve<ISomeHelper>(); 
    } 

    public ISomeHelper SomeHelper { get; set; } 
} 

Sé que esto es una mierda, pero me temo que es la dura realidad. ¿O tal vez cambiar a Ninject? Funciona muy bien con ASP.NET MVC 3 y su IDependencyResolver.

+0

¿Cómo funciona la inyección de propiedad en mis controladores? – Blankman

+0

espera, ¿entonces tengo que configurar manualmente las dependencias de SomeHelper para entonces, ¿verdad? – Blankman

+1

@Blankman, la inyección de dependencia funciona en controladores porque ha utilizado una fábrica de proveedor de controlador personalizado que usa windsor para inyectar esas dependencias. En lo que respecta a su segunda pregunta sobre las dependencias de SomeHelper, no necesita configurarlas manualmente. Configura esas dependencias de la misma manera que si fuera una dependencia de controlador. Cuando usas '.Resuelva () 'esto proporcionará automáticamente dependencias registradas. –

0

Creo que lo que querrás hacer es conectarte a la ubicación del servicio de MVC3 para controlar cómo se crean las páginas de vista. No he usado MVC3 todavía, pero encontré an article that describes the Service Location feature y eso puede darle el "gancho" que necesita para poder acceder a WebViewPage antes de que se procese.

Al obtener acceso a WebViewPage antes de que se procese, puede usar Windsor para realizar la inyección de propiedad de su página de visualización. Por defecto, Windsor solo hace inyección de constructor, pero puedes encontrar un sample of doing property injection via an extension method en una publicación de blog que hice hace un par de años en MVC1 ActionFilters.

+0

mina está haciendo inyección de propiedad muy bien, no estoy seguro de lo que hice, pero está trabajando con eso. – Blankman

Cuestiones relacionadas