ASP.NET MVC dovrei fare riferimento al DAL dall'interfaccia utente?

3

Sto sviluppando un'applicazione ASP.NET MVC e ho tre progetti:

UI (con riferimento a system.web.mvc, riferimenti BL e DAL)
BL (facciata aziendale e oggetti commerciali)
DAL (contiene le mie entità / poche classi e si connette al DB usando un assembly esterno)

Sto costruendo i miei viewmodels nel livello dell'interfaccia utente, utilizzando i dati contenuti nelle mie entità DAL, quindi la mia interfaccia utente fa riferimento a BLL e DAL, ma non sono sicuro che nel progetto dell'interfaccia utente debba esistere un riferimento DAL.

Stavo pensando di creare una classe nel livello BL che utilizza i dati contenuti nelle entità DAL e quindi creare i miei viewmodels usando la nuova classe, ma sembra molto ripetitiva e ridondante.

Che cosa ne pensate voi ragazzi? Quello che voglio fare è costruire i miei modellini visivi usando i dati contenuti nella base dati

    
posta Enrique Olvera 03.12.2014 - 00:44
fonte

3 risposte

2

In genere non espongo il DAL direttamente all'interfaccia utente.

Normalmente, creo classi di modelli il più vicino possibile alla rappresentazione finale dell'interfaccia utente. E wrapper che traducono / trasformano una o più entità dal DB in quelle.

Questo, come hai detto, potrebbe sembrare un po 'ridondante, ma è utile quando il viewmodel diventa abbastanza complesso in modo da avere rappresentazioni diverse per l'interrogazione di oggetti multipli rispetto all'aggiornamento / inserimento / eliminazione di quelli.

In realtà è ispirato al modello di progettazione CQRS, dove vengono utilizzate diverse rappresentazioni per le query (le nuove classi avvolte di cui parlavate) e gli aggiornamenti dal viewmodel alle entità che utilizzano i comandi.

Ecco un link molto valido dal blog di Martin Fowler che spiega CQRS.

In realtà utilizzo Web API 2 per i comandi poiché le applicazioni Web sono molto intensive sul lato client (KnockoutJS, ecc.).

    
risposta data 03.12.2014 - 01:30
fonte
2

Hai ragione, il riferimento DAL NON dovrebbe esistere nel progetto dell'interfaccia utente. Dovresti invece creare oggetti DTO per inviare / ricevere dati al tuo BLL. Può essere un progetto separato chiamato DTO o può essere incluso nella BLL creando cartelle specifiche come Customer e posizionando le sue classi di facciata insieme alle DTO in quella cartella. BLL sarà responsabile della mappatura degli oggetti DAL in DTO BLL avanti e indietro (userei AutoMaper per questo scopo).

Quindi dovresti creare DUE DTO per ogni oggetto DAL. Come se avessimo una classe Customer in DAL, quindi creerei DUE DTO per questo come segue:

    public class CustomerBrief
    {
        public string Name {get; set;}
        public string Address {get; set;}
        public string Email {get; set;}
    }    

    //excuse my naming conventions :)
    public class CustomerFull : CustomerBrief
    {
        public string SomeOtherFieldThatYouNeedInDetail_1 {get; set;}
        public string SomeOtherFieldThatYouNeedInDetail_2 {get; set;}
        public string SomeOtherFieldThatYouNeedInDetail_3 {get; set;}
    }

Quindi, quando hai bisogno di un elenco di Customers , puoi restituire List<CustomerBrief> . E quando hai bisogno di tutti i dettagli del cliente, puoi restituire CustomerFull . In questo modo solo i dati effettivamente necessari vengono passati al Web.

Ora, faresti riferimento solo al BLL nel tuo progetto di interfaccia utente e ora il tuo Customer ViewModel potrebbe essere simile al seguente:

    public class CustomerVM
    {
        public CustomerFull Customer {get; set;}
        public List<CountryBrief> Countries {get; set;}
    }
    
risposta data 12.12.2014 - 13:52
fonte
0

Generalmente non esporre i miei oggetti poco al livello dell'interfaccia utente. Creare uno strato wrapper / oggetti dominio che trasformerà i dati del livello Dal. In questo modo puoi controllare i dati sul livello dell'interfaccia utente.

    
risposta data 03.12.2014 - 01:02
fonte

Leggi altre domande sui tag