¿Cuáles son los buenos candidatos para la clase de controlador base en ASP.NET ¿MVC?


He visto a mucha gente hablar sobre el uso de controladores base en su ASP.NET MVC projects. Los ejemplos típicos que he visto hacen esto para la tala o tal vez andamios CRUD. ¿Cuáles son otros buenos usos de una clase de controlador base?

Author: kenwarner, 2011-05-25

9 answers

No hay buenos usos de una clase de controlador base.

Ahora escúchame.

Asp.Net MVC, especialmente MVC 3 tiene toneladas de ganchos de extensibilidad que proporcionan una forma más desacoplada de agregar funcionalidad a todos los controladores. Dado que sus clases de controladores son muy importantes y centrales para una aplicación, es realmente importante mantenerlos ligeros, ágiles y sueltos acoplados a todo lo demás.

  • Logging infrastructure belongs in a constructor y debe ser inyectar a través de un marco DI.

  • El andamio CRUD debe ser manejado por generación de código o un personalizado Proveedor de ModelMetadata.

  • Global exception handling should be manejado por un ActionInvoker personalizado.

  • Vista global de datos y autorización debe ser manejado por filtros de acción. Aún más fácil con los filtros de acción global en MVC3.

  • Las constantes pueden ir en otra clase / archivo llamado ApplicationConstants o algo.

Los controladores base generalmente son utilizados por desarrolladores MVC inexpertos que no conocen todas las diferentes piezas de extensibilidad de MVC. Ahora no me malinterpretes, no estoy juzgando y trabajando con personas que los usan por todas las razones equivocadas. Su experiencia justa que le proporciona más herramientas para resolver problemas comunes.

Estoy casi seguro de que no hay un solo problema que no pueda resolver con otro gancho de extensibilidad que una clase de controlador base. No te enfrentes a la la forma más estrecha de acoplamiento (herencia) a menos que haya una razón de productividad significativa y no viole Liskov. Prefiero tomar el public ILogger Logger { get; set; } que introducir un acoplamiento apretado que afecta a la aplicación de maneras mucho más significativas.

Incluso algo como un userId o una clave multitenant puede ir en una ControllerFactory en lugar de un controlador base. El costo de acoplamiento de una clase de controlador base es solo no vale la pena.

 34
Author: jfar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-07 11:41:05

Me gusta usar el controlador base para la autorización.

En lugar de decorar cada acción con el atributo "Authorize", hago la autorización en el controlador base. La lista de acciones autorizadas se obtiene de la base de datos para el usuario registrado.

Por favor, lea el siguiente enlace para obtener más información sobre la autorización. Buena práctica para hacer una autorización común en una fábrica de controladores personalizados?

 7
Author: vrluckyin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 10:29:34

Lo uso para acceder a la sesión, datos de la aplicación, etc.

También tengo un objeto de aplicación que contiene cosas como el nombre de la aplicación, etc. y acceso desde la clase base

Esencialmente lo uso para cosas que repito mucho

Oh, debo mencionar que no lo uso para lógica de negocios o acceso a bases de datos. Las constantes son una muy buena apuesta para una clase base también supongo.

 3
Author: griegs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-25 03:33:15

He usado base controller en muchos de mis proyectos y he trabajado fantástico. Se utiliza principalmente para

  • Registro de excepciones
  • Notificación (éxito, error, adición..)
  • Invocando el manejo de errores HTTP404
 3
Author: AkxumiteEmpire,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-06 22:27:55

Desde mi experiencia, la mayor parte de la lógica que querrías poner en un controlador base idealmente iría a un filtro de acción. Los filtros de acción solo se pueden inicializar con constantes, por lo que en algunos casos simplemente no se puede hacer eso. En algunos casos necesita que la acción se aplique a cada método de acción en el sistema, en cuyo caso puede tener más sentido poner su lógica en una base en lugar de anotar cada método de acción con un nuevo atributo ActionFilter.

También he encontrado útil poner propiedades que hacen referencia a servicios (que de otro modo se desacoplan del controlador) en la base, lo que los hace fáciles de acceder e inicializados consistentemente.

 2
Author: hannasm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-25 04:37:28

Usamos el BaseController para dos cosas:

  1. Atributos que deben aplicarse a todos los Controladores.
  2. An override of Redirect, que protege contra ataques de redirección abiertos comprobando que la URL de redirección es una URL local. De esta manera todos los Controladores que llaman a Redireccionamiento están protegidos.
 1
Author: Henry Fieger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-25 19:49:13

Ahora estoy usando un controlador base para la internacionalización usando la biblioteca i18N. Proporciona un método que puedo usar para localizar cualquier cadena dentro del controlador.

 1
Author: Random,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-14 03:13:02

Lo que hice fue usar una clase base de controlador genérica para manejar:

  • He creado BaseCRUDController<Key,Model> que requiere un objeto ICRUDService<TModel> como parámetro constructor para que la clase base maneje Create / Editar / Suprímase . y seguro en modo virtual para manejar en situaciones personalizadas
  • El ICRUDService<TModel> tiene métodos como Guardar / Actualización / Eliminar / Encontrar / ResetChache /... y lo implemento para cada repositorio que creo para poder agregar más funcionalidad.
  • usando esta estructura podría agregar algunas funcionalidades generales como PagedList / Autocompletar / ResetCache / IncOrder & DecOrder (si el modelo es ordenable)
  • Error / Notificación manejo de mensajes: una parte en Layout con código @TempData["MHError"] y una Propiedad en el Controlador base como

    Error de Notificación Pública { set { TempData ["MHError"] = value; } get { return (Notificación) TempData.Peek ("MHError"); } }

Con estas clases abstractas podía manejar fácilmente métodos que tenía que escribir cada vez o crear con Code Generator. Pero este enfoque también tiene su debilidad.

 0
Author: ghazyy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-04 07:14:38

El filtro no es seguro para subprocesos, la condición del acceso a la base de datos y la inyección de dependencias, las conexiones a la base de datos pueden ser cerradas por otro subproceso cuando se usa.

 0
Author: B.W,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-13 18:06:36