15

En mi aplicación ASP.Net MVC he implementado un Custom ActionFilter para autorizar a los usuarios.Inyectar dependencia en CustomAttribute usando Castle Windsor

utilizo CastleWindsor para proporcionar la inyección de dependencias en todos los controladores de la siguiente manera:

protected virtual IWindsorContainer InitializeServiceLocator() 
    { 
     IWindsorContainer container = new WindsorContainer(); 
     ControllerBuilder.Current.SetControllerFactory(new WindsorControllerFactory(container)); 

     container.RegisterControllers(typeof(HomeController).Assembly); 
     ComponentRegistrar.AddComponentsTo(container); 

     ServiceLocator.SetLocatorProvider(() => new WindsorServiceLocator(container)); 

     return container; 
    } 

Dentro de mi CustomAttribute, necesito una dependencia que es utilizado por todos mis controladores, sin embargo soy incapaz de Constructor de usuario inyección basada en un atributo.

¿Cuál es la forma más limpia de salir? ¿Cómo puedo proporcionar la dependencia?

+7

No ponga comportamiento en los atributos ... –

+0

posible duplicado de [¿Cómo utilizo Windsor para inyectar dependencias en ActionFilterAttributes] (http://stackoverflow.com/questions/553330/how-do-i-use- windsor-to-inject-dependencies-into-actionfilterattributes) – BonyT

+0

La mejor respuesta de mi humilde opinión está aquí http://stackoverflow.com/questions/10708565/asp-net-mvc-ifilterprovider-and-separation-of-concerns (y en esa pregunta sí mismo - muy buen ejemplo (pista: 'IFilterProvider')). –

Respuesta

12

OK - esto parece ser un duplicado de Database injection into a validation attribute with ASP MVC and Castle Windsor que ha sido respondido.

También How do I use Windsor to inject dependencies into ActionFilterAttributes.

Después de leer todo lo anterior, y los artículos mencionados, la clave para mí es http://weblogs.asp.net/psteele/archive/2009/11/04/using-windsor-to-inject-dependencies-into-asp-net-mvc-actionfilters.aspx para cualquier otra persona que esté interesada.

1

No puede. Los atributos son metadatos. Ponerles comportamiento es incorrecto. Poner dependencias es aún peor.

Use su atributo como marcador para indicar los objetos a los que desea aplicar el comportamiento e implementar el comportamiento en otro lugar.

En MVC en otros lugares generalmente significa un invocador de acción personalizado que utiliza datos del atributo para proporcionar el comportamiento que necesita.

+2

OK - Por favor, explique la diferencia entre lo que estoy haciendo y este artículo: http://www.asp.net/mvc/tutorials/understanding-action-filters-vb – BonyT

+18

Además, esta respuesta proporciona críticas sin dar realmente ningún tipo de solución ... "¿en otro lugar?" Por favor sea especifico. ¿Cómo implementaría la autorización que se aplica a través de la aplicación en muchos controladores y requiere una dependencia? – BonyT

+0

Tuve que anular el downvote con un gran voto positivo. Una imagen dice más de mil palabras. – Steven

Cuestiones relacionadas