¿Cómo debo integrar el estado de la sesión en una aplicación ASP.NET MVC?

Estoy buscando ideas sobre cómo debo usar Session en una aplicación ASP.NET MVC. Especialmente cuando se usan páginas maestras y se intenta simplemente llevar los datos a la página maestra sin pasar por alto el controlador. Comencé esta pregunta haciendo muchas preguntas pequeñas, pero luego logré moldearla en una solución que aún no he implementado, pero que es algo viable. Agradecería cualquier comentario.

Mi solución propuesta, también conocida como 'lo que estoy a punto de implementar, a menos que alguien diga ¡Alto!'

Tengo mis clases de modelo heredadas de ModelBase, que contiene la información que necesita la página maestra (solo hay una vista por página) para ciertas cosas que muestra en el encabezado o pie de página, así como la configuración basada en la configuración basada en quién está conectado.

Mi mejor solución es la siguiente: se muestra aquí para una 'página de productos':

Suposición: En algún momento ya he bloqueado ciertos datos en la sesión, por ejemplo, tal vez unpartnerId que entró a través de una página de puerta de enlace, o uncurrentLoggedInUserEmail propiedad o un objeto completamente explotado.

tengo unModelBase clase de la que cada modelo, comoProductModel hereda

tengo unMySiteControllerBase clase (hereda del controlador), que se subclasifica porProductController.

En mi método de acción enProductController Creo el modelo para la vista del producto con'new ProductModel()'. Esta clase de modelo en sí misma no sabe nada acerca de la sesión o cómo llenarlaModelBase. Esencialmente ni siquiera sabe sobreModelBase - Simplemente hereda de él. Mi constructor encadenado no hace nada (porque no quiero pasarloSession)

AnuloView(...) enMySiteControllerBase para todas las sobrecargas que toman un parámetro modelo. Compruebo si ese parámetro es de tipoModelBase y si es así, relleno las propiedades comopartnerid ycurrentLoggedInuserEmail. Afortunadamente porque estoy dentro de una clase que hereda deController Tengo acceso directo aSession para poder sacarlos de allí.

Este método significa que las propiedades enModelBase se rellenan automáticamente solo por mí haciendo'return View(model)'. Sin embargo, hay un problema obvio si el modelo paraProductModel necesita acceder a cualquier cosa definida enModelBase. Va a quedar nulo porque aún no está poblado.

Este problema se puede resolver pasandoSession anew ProductModel(session) que a su vez lo pasaría por la cadena del constructornew ModelBase(session). Yo realmenteno aunque me gusta esa solución porque me gusta pensar en un modelo como una estructura de datos bastante tonta que no debería conocer ninguna construcción de datos externos. Otra solución podría ser simplemente aletearlo, y si alguna vez encuentro esoProductController necesita consumir cualquier cosa definida enModelBase que acabo de crear un métodoMySiteControllerBase.UpdateModelBase(productModel, session) para poblarlo explícitamente dentroProductController. ¡Espero que eso esté claro!

Otras preguntas que me vienen a la mente son:

¿Qué pasa con las pruebas unitarias? ¿Hay alguna abstracción en torno al estado de la sesión en MVC o debería construir la mía? ¡Hice una búsqueda en el código fuente para 'sesión' y no apareció nada!¿Cómo funciona el seguimiento de sesión con / REST / FUL / URLS en MVC? ¿Hay algún problema con las cookies que necesito saber?¿Debería pensar en la sesión de manera diferente a como lo he hecho tradicionalmente?

Respuestas a la pregunta(2)

Su respuesta a la pregunta