Respecto de la estructura de una solución MVC, vamos a decir de forma sintética que está organizada en capas o proyectos. Cada capa tiene su fundamento y su responsabilidad específica. Esto quiere decir que, al momento de insertar código nuevo o buscar código hecho en una solución, tendremos que tener en cuenta esto para dirigirnos a la capa adecuada. Las capas básicas son:
Domain: Esta capa tiene como objetivo albergar todos aquellos elementos necesarios para describir el dominio del problema. Es decir que, su función principal, es albergar todas las entidades o clases que se necesiten para dar solución al problema o los problemas que dieron origena al desarrollo de la solución. En esta capa, vamos a encontrar:
Entidades o clases: Estas por lo general constan de los conceptos que se utilizaron para diseñar la solución del problema. Poseen nombre y atributos o propiedades y se encuentran en la raíz del proyecto.
Enumeraciones: Estos componentes sirven para poder equiparar un valor en texto con uno numérico y de esta manera, evitar utilizar en el código valores numéricos "en duro" para referirse a ciertas cosas. Tienen un uso muy específico.
Dtos: Descriptores de archivo. Se utilizan cuando hay que modelar un determinado objeto, para necesidades específicas y que, por lo general, se compone de datos que se encuentran en distintas entidades.
Interfaces de Repositorio: Para poder mantener la independencia de la capa de acceso a datos y hacer que todas las posibles capas de acceso a datos respondan a un único comportamiento general del sistema, es necesario que se incluyan en esta capa las descripciones de los comportamientos o de las necesidades de datos que tiene cada entidad.
Infrastructure: Se encuentran las clases que implementan las interfaces de repositorio de las que hablamos previamente. En esta capa se efectúa realmente el acceso a datos
Logic(*): Aquí van todas las clases referentes a la lógica de negocios, validaciones y procesamiento de datos. Es el nexo entre la capa de presentación y la de acceso a datos (infrastructure). En esta capa, vamos a encontrar:
Contracts: Son las interfaces de esta capa. Las mismas van a ser invocadas desde la capa de Presentación.
Common(*): Carpeta donde deben ir todas las clases que se van a implementar que sean comunes a todos los clientes a los cuales está dirigida la aplicación.
Una carpeta por cada cliente(*): Dentro de estas carpetas solo deberíamos encontrar todas aquellas lógicas y métodos que se salen de lo normal, que tienen alguna diferencia con los demás clientes y por ende, no pueden formar parte del comportamiento común. El switch para saber qué lógica ejecutar se hace, basado en una variable del web.config, que se encuentra dentro de la sección appsettings y se llama CustomizationsSet. La aplicación, al ser invocado un método de la Lógica desde la capa de presentación, se va fijar en el contenido de esa variable y va a buscar primero en la carpeta con el mismo nombre que el valor de la variable. Si por ejemplo, tenemos:
<add key="CustomizationsSet" value="Ejesa" />
El sistema va a buscar dentro de la carpeta Ejesa, de la capa Logic, la clase de la lógica y el método que se invocó. Si no lo encuentra, lo va a buscar a Common. De esta forma, nos aseguramos de que, si hay alguna particularización del comportamiento de algún método para algún cliente, busque primero en lo particular y, solo si no encuentra ahí, ejecute lo común.
Presentation: En esta capa vamos a encontrar todo lo que hace a la Interfaz de Usuarios, como ser:
Content: Aquí van todos los archivos css y las imágenes.
Scripts: Aquí van todos los archivos javascripts.
Controller: Aquí van los controladores. Idealmente, los métodos de esta carpeta, solo deben ser "pasamensajes", es decir, recibir datos de la vista, enviar a la capa lógica y devolve resultados.
Views: Aquí van las vistas (los archivos .cshtml) y se repite el esquema de la capa Logic. (*) Carpeta "Common" y una carpeta por cada cliente que difiera de la vista estándar. De esta forma, cuando el controller hace un return View o PartialView o similares, el sistema buscará primero la vista en la carpeta acorde al valor del CustomizationsSet del web.config. De no encontrarla, buscará en "Common".
(*) Tanto la capa Logic como la implementación de las carpetas Common y una por cada cliente en las distintas capas puede que no existan en algunos proyectos viejos.