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.
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
@thekip - Estoy enterado de eso. Así que agregué la etiqueta ioc para eso. – AnyOne
Parece que podría estar buscando [AOP on .NET] (http://www.sharpcrafters.com/aop.net). –