Bueno, supongo que su pregunta es, cómo diseñar "capas" en la aplicación MVC. Eche un vistazo a esta arquitectura simple, la utilizo para mis aplicaciones MVC y parece ser limpia y eficiente.
proyecto en la solución - modelo de negocio - biblioteca de clases simple llena de clases de POCO que representan el dominio comercial. Aquí puede usar la anotación de datos, las clases de metadatos para la lógica de validación, etc.
proyecto - Depósitos basados en EF - otra biblioteca de clases simple; aquí está el contexto definido (primero el código EF es genial, pero primero puedes usar la base de datos EF o el modelo; solo tienes que agregar la plantilla POCO T4 a la biblioteca de clases de modelo de negocio, no es gran cosa) y un conjunto de clases - repositorios
proyecto - por lo general lo llamo "ServiceLayer" más o menos (estoy abierto a sugerencias para un mejor nombre :) - contiene solo interfaces, para repositorios y otros servicios (implementados en proyectos separados) que mi MVC (o cualquier otra tecnología)) uso basado en la aplicación; repositorios de 2.project implementan estas interfaces
proyecto - sitio web de MVC. Utiliza la inyección de dependencia (compilación en DependencyResolver, y me encanta usar el contenedor Ninject) para mapear repositorios (y otros servicios); A continuación, puede utilizar la inyección de constructor en los controladores, o algún enfoque "perezosa" (véase más adelante)
se ve algo como esto:
controlador flaco:
public class SomethingController : BaseController
{
public ActionResult DoSomething(SomeBusinessThing input)
{
if (ModelState.IsValid)
{
var result = CustomerRepository.DoSomeBusinessLogicAndPersistenceAndStuff(input);
return View(result); // you can use AutoMapper here, if you dont want to use business object as viewmodels
}
}
}
Mi repositorio "propiedad "es heredado de mi BaseController:
public class BaseController : Controller
{
// ... other stuff used by all (or multiple) controllers
private ICustomerRepository _customerRepository;
protected ICustomerRepository CustomerRepository
{
get
{
if (_customerRepository== null)
_customerRepository= DependencyResolver.Current.GetService();
return _customerRepository;
}
}
}
Puede usar este DI" perezoso "si su el controlador usa muchos servicios, pero solo 1-2 por acción, por lo que sería poco eficiente inyectarlos a todos con el constructor.Alguien podría decir que estás "ocultando" la dependencia de esta manera, pero si mantienes todo esto en un solo lugar, BaseController, no es gran cosa.
Bueno, la implementación del repositorio es realmente su negocio. aplicación MVC incluso no sabe que está utilizando EF, que no conoce más que las interfaces de servicios, y no le importa acerca underlaying aplicación
Conslusion (que se puede cambiar en cualquier momento posterior si es necesario!):
Los controladores son delgados - no hay lógica comercial
El modelo es FAT - y en este caso, los repositorios encapsulan toda la lógica comercial (puede usar otros tipos de servicios, por ejemplo algunas calculadoras para procesamiento, etc.) , A MVC no le importa, sabe todo Interfaces y)
ViewModels son entrada para Vistas (y modelo de vista puede ser su modelo de negocio directamente, o puede utilizar AutoMapper para crear ViewModels "puros")
Esta es una buena lectura sobre arquitectura para aplicaciones .NET y tiene una sección sobre MVC: http://www.amazon.com/Microsoft%C2%AE-NET-Architecting-Applications-Pro-Developer/dp/073562609X –