2011-08-16 22 views
7

Estoy interesado en el concepto de interceptor en los últimos tiempos. Sé que este concepto se usa en muchas bibliotecas como NHibernate, Entity Framework y otras. Pero estoy interesado en cómo usar este concepto en la aplicación web ASP.NET MVC.¿Dónde y cómo usar los interceptores en la aplicación web?

¿Dónde es útil usarlo en la aplicación web Mvc?

¿Existe algún proyecto de fuente abierta Asp.Net Mvc que utilice interceptores?

Asp.net Mvc ya admite un tipo de interceptor para controlador con filtros. ¿Es mejor usar filtros en lugar de interceptores?

+1

Yo diría que echa un vistazo a Dependency Injection, ya que es un término utilizado con más frecuencia para el tipo de funcionalidad que está buscando. – thekip

+0

@thekip - Estoy enterado de eso. Así que agregué la etiqueta ioc para eso. – AnyOne

+0

Parece que podría estar buscando [AOP on .NET] (http://www.sharpcrafters.com/aop.net). –

Respuesta

0

Yo diría que usa un contenedor DI más genérico para inyectar sus dependencias. Esto no solo inyecta dependencias en su controlador, sino que también sirve a las dependencias de esas dependencias, lo que da como resultado un gráfico de objetos completo de todos sus objetos dependientes.

El uso de un contenedor DI para la parte delantera también ofrece buenas oportunidades para hacer que su parte posterior sea más comprobable y acoplado libremente.

+0

Heyy no ha dicho nada sobre los interceptores ... – AnyOne

+0

No conozco ninguna funcionalidad que un interceptor no pueda ofrecer en lugar de un contenedor DI. – thekip

+0

No he tenido la intención de usar puro interceptores sin contenedores DI en mi pregunta. Está implícitamente intentado – AnyOne

5

interceptación puede ser utilizado para muchas cosas más notables - para hacer frente a las preocupaciones transversales tales como la instrumentación, registro, auditoría, seguridad, medición, etc.

Usted don't need a DI Container to apply the concept, pero ayuda.

Puede utilizar los filtros ASP.NET MVC para lograr aproximadamente el mismo efecto, pero ¿por qué limitarse al marco MVC cuando puede aplicar una implementación generalmente reutilizable?

12

Dónde/cuándo utilizar interceptores

Tome un vistazo a una solicitud previa que haya desarrollado y examinar el código. Busque el código que se duplica con frecuencia al principio o al final de los métodos y propiedades. Este es un código que puede considerar pasar de todos esos métodos a un interceptor. Por ejemplo, me he dado cuenta de que muchas de mis acciones MVC que realizan la validación de entrada, lo hacen con los mismos mismos par de líneas de código:

if (!ModelState.IsValid) 
    return View(model); 

Este es el código que potencialmente podría ser trasladado a un interceptor (probablemente un filtro de MVC en este caso). ¿El costo de escribir y aplicar el filtro supera el costo de este código duplicado? (2 líneas de código multiplicado por el número de acciones del controlador que usan esto). En este caso, tal vez no. Sin embargo, existen otras situaciones en las que el beneficio de usar un interceptor sería mayor.

Aquí es una lista de algunas situaciones en las que me imagino este tipo de duplicación de código que podría ocurrir, es decir escenarios que olor como podrían beneficiarse de interceptores:

  • de validación de entrada (como se ilustra arriba)
  • Registro de depuración. Puede write an interceptor que registra la entrada y la salida de cada llamada a un método.
  • Sincronización de subprocesos. Su pregunta es sobre aplicaciones web, pero si está desarrollando una aplicación de Windows con una vista de estilo MVP, puede aplicar un interceptor que asegure que todas las llamadas a métodos se sincronicen de nuevo con el subproceso de la interfaz de usuario.
  • Transacciones de base de datos. mayor parte de mi código de transacción de base de datos tiene el siguiente aspecto:

 

using (var transaction = Session.BeginTransaction()) 
{ 
    // ... do some work that is unique to this method ... 
    transaction.Commit(); 
} 
  • PropertyChanged implementaciones de eventos. Este código suele ser muy repetitivo y molesto de escribir. Sacha Barber has thoroughly explored how to automatically implement this event using various frameworks.
  • Seguridad. Probablemente haya muchos métodos en su aplicación que deberían restringirse solo a ciertos usuarios. The AuthorizeAttribute es un filtro para exactamente esto.
  • Asignación de solicitud de servicio web. Algunas API, como la API para Basecamp, le piden que limit your requests a una cierta cantidad de solicitudes por un período de tiempo dado. Si escribió una clase de cliente de Basecamp, puede aplicarle un interceptor para asegurarse de que todas las llamadas al método cumplan con el límite de velocidad, usando Thread.Sleep cuando sea necesario.
  • Caché de resultados.MVC has some filters pre-built for this purpose. Podría escribir su propio interceptor para almacenar los resultados de las capas debajo de la capa de la interfaz de usuario.
  • WCF gestión de errores. No puede Dispose un cliente WCF si está en el estado Faulted, por lo que cada método que crea y destruye una instancia del cliente necesita verificar el estado, luego llame al Abort si es necesario en lugar de simplemente empaquetar una cláusula using alrededor del cliente. Un interceptor podría no ser el mejor en este caso. Probablemente sea más fácil to just fix the Dispose implementation or use some kind of wrapper.

El hecho de que los ejemplos anteriores sean o no buenos candidatos para los interceptores depende de las complejidades únicas de su aplicación. Esta lista, por supuesto, no es exhaustiva, ni puede serlo. Las posibles aplicaciones de los interceptores son tan variadas como las aplicaciones que escribes.

Cómo utilizar interceptores

que se me ocurren tres lugares principales donde es posible que desea aplicar un interceptor: controladores, servicios y objetos de dominio.

  • Con un controlador MVC , que tiene más sentido para seguir adelante y utilizar MVC's filters.
  • Para un servicio de nivel medio que sacaría de su contenedor IoC, los filtros no son una opción (porque no es un controlador), por lo que debe utilizar el interception features of your IoC container.
  • Para sus objetos de dominio que normalmente crea una instancia directamente con un constructor (si es una entidad nueva) o obtiene de su ORM de elección (si es una entidad existente), necesitará usar algún tipo de Objeto fábrica en lugar del constructor y instruct your ORM how to use the factory.

Los detalles esenciales sobre cómo lograr todo esto dependerán de las herramientas que esté utilizando.

Cuestiones relacionadas