Bene, suppongo che la tua domanda sia, come progettare "livelli" nell'applicazione MVC. Dai un'occhiata a questa semplice architettura, io la uso per le mie app MVC e sembra essere pulita ed efficiente.
progetto in soluzione - modello di business - semplice libreria di classi completa di classi POCO che rappresentano il dominio aziendale. È possibile utilizzare l'annotazione dei dati qui, le classi di metadati per la logica di convalida, ecc.
progetto - repository basati su EF - un'altra libreria di classi semplice; qui è definito contesto (il codice EF prima è ottimo, ma è possibile utilizzare prima il database EF o prima il modello - è sufficiente aggiungere il modello POCO T4 alla libreria di classi del modello di business, non un grosso problema) e un insieme di classi - repository
- progetto
- di solito lo chiamo "ServiceLayer" o così (sono aperto al suggerimento per un nome migliore :) - contiene solo interfacce, per repository e altri servizi (implementati in progetti separati) che sarà il mio MVC (o qualsiasi altra tecnologia) uso dell'applicazione basato; repository from 2.project implementare queste interfacce
- progetto
- sito MVC. Utilizza l'iniezione delle dipendenze (build in DependencyResolver e mi piace usare il contenitore Ninject) per mappare i repository (e altri servizi); Quindi è possibile utilizzare l'iniezione costruttore in controllori, o qualche approccio "pigro" (vedi sotto)
Sembra qualcosa di simile a questo:
regolatore Magro:
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
}
}
}
mio repository "proprietà "è ereditato dal mio 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;
}
}
}
È possibile utilizzare questo DI" pigro "se il il controller usa molti servizi, ma solo 1-2 per azione, quindi sarebbe inefficiente iniettarli tutti con il costruttore.Qualcuno potrebbe dire che stai "nascondendo" la dipendenza in questo modo, ma se tieni tutte queste cose in un posto - BaseController, non è un grosso problema.
Bene, l'implementazione del repository è davvero il tuo business. applicazione MVC non so nemmeno che si sta utilizzando EF, si conosce solo le interfacce di servizi e non si preoccupa circa underlaying implementazione
Conslusion (che è possibile passare in qualsiasi momento in seguito, se è necessario!):
I controllori sono magri - nessuna logica aziendale
Il modello è FAT - e in questo caso i repository racchiudono tutta la logica di business (è possibile utilizzare anche altri tipi di servizi, ad esempio alcuni calcolatori per l'elaborazione, ecc., Ricordare MVC non si preoccupa, lo sa interfacce y)
ViewModels sono input per Vista (e ViewModel può essere il vostro modello di business direttamente, oppure è possibile utilizzare automapper per la creazione di ViewModels "puri")
Questa è una buona lettura sull'architettura per le applicazioni .NET e ha una sezione su MVC: http://www.amazon.com/Microsoft%C2%AE-NET-Architecting-Applications-Pro-Developer/dp/073562609X –