Domanda

Il progetto attualmente sto lavorando in richiede un sacco di pagine searhing / filtraggio. Per esempio io ho una pagina di ricerca comlex per ottenere emissioni effettuate da dati, categoria, unità, ...

Edizione dominio di classe è complesso e contiene un sacco di oggetti di valore e oggetti figlio.

.Io mi chiedo come le persone affrontano Ricerca / Filtering / Reporting per l'interfaccia utente. Per quanto ne so io ho 3 opzioni, ma nessuno di loro mi fanno felice.

1.) Invia i parametri al deposito / DAO per ottenere DataTable e Bind DataTable a UI Controls.For Esempio di ASP.NET GridView

DataTable dataTable =issueReportRepository.FindBy(specs);
.....
grid.DataSource=dataTable;
grid.DataBind();

In questa opzione posso semplicemente passare il livello di dominio e il database query per date specifiche. E non devo ottenere completamente costruito oggetto di dominio complesso. Non c'è bisogno di oggetti di valore, oggetti figlio, .. Ottenere dati visualizzati nell'interfaccia utente in DataTable direttamente dal database e mostrare nell'interfaccia utente.

Ma se hanno bisogno di mostrare un campo calcolato nella UI, come valore di ritorno del metodo che devo fare questo nel database perché non ho pienamente oggetto di dominio. Ho duplicare problemi di logica e DataTable come nessun intellisense ecc ...

2.) Invia i parametri al deposito / DAO per ottenere DTO e Bind DTO a controlli UI.

IList<IssueDTO> issueDTOs =issueReportRepository.FindBy(specs);
....
grid.DataSource=issueDTOs;
grid.DataBind();

In questa opzione è uguale a come sopra, ma devo creare anemico DTO oggetti per ogni pagina di ricerca. Anche per diverse pagine di ricerca problema che ho di mostrare diverse parti del Problema Objects.IssueSearchDTO, CompanyIssueTO, MyIssueDTO ....

3.) Invia i parametri alla classe repository reale per ottenere oggetti di dominio completamente costruiti.

IList<Issue> issues =issueRepository.FindBy(specs);
//Bind to grid...

Mi piace Dominio Progettazione e Patterns Driven. Non v'è alcuna logica DTO o la duplicazione in questo option.but in questa opzione devo creare il lotto di bambino e oggetto valore che non verrà mostrata nella UI.Also richiede ob del sacco si uniscono per ottenere l'oggetto del dominio pieno e costo delle prestazioni per gli aghi bambino oggetti e oggetti di valore.

Non faccio uso di qualsiasi strumento ORM Forse posso implementare pigro Caricamento a mano per questa versione ma sembra un po 'eccessivo.

Quale preferisci? O sto facendo male? Ci sono dei suggerimenti o modo migliore per fare questo?

È stato utile?

Soluzione

Ho un paio di suggerimenti, ma naturalmente la risposta generale è "dipende".

In primo luogo, si dovrebbe utilizzare uno strumento ORM o si dovrebbe avere una buona ragione per non essere facendo così.

In secondo luogo, l'attuazione di Lazy Loading a mano è relativamente semplice così nel caso in cui non avete intenzione di utilizzare uno strumento ORM, si può semplicemente creare immobili in oggetti che dicono qualcosa del tipo:

private Foo _foo;
public Foo Foo
{  
  get {  
         if(_foo == null)
         {
            _foo = _repository.Get(id);
         }
         return _foo;
       }
}

In terzo luogo, le prestazioni è qualcosa che dovrebbe essere considerato inizialmente, ma non deve guidare lontano da un design elegante. Direi che si dovrebbe usare (3) inizialmente e discostarsi da esso se la sua prestazione è insufficiente. Questo si traduce per iscritto la minor quantità di codice e avere il minimo di duplicazione nel vostro progetto.

Se le prestazioni soffre si può affrontare facilmente nello strato UI utilizzando Caching e / o nel vostro livello di dominio utilizzando caricamento pigro. Se questi due non riescono a fornire prestazioni accettabili, allora si può cadere di nuovo ad un approccio DTO in cui si passa solo indietro una collezione leggera di oggetti di valore necessari.

Altri suggerimenti

Questo è un grande domanda e ho voluto fornire la mia risposta pure. Credo che il tecnicamente migliore risposta è di andare con l'opzione # 3. Esso fornisce la capacità di descrivere meglio e organizzare i dati con scalabilità per i futuri miglioramenti di reporting / Offerte di richieste.

Tuttavia mentre questo potrebbe essere l'opzione migliore in assoluto, v'è un costo enorme IMO contro le altre opzioni (2), che sono i tempi di progettazione supplementare per tutte le classi e le relazioni necessarie per supportare il segnalazione esigenze (di nuovo con la premessa che non esiste uno strumento ORM in uso).

I lotta con questo in un sacco di mie applicazioni come bene e la realtà è che 2 # è il miglior compromesso tra tempo e design. Ora, se si dovesse chiedere circa i vostri oggetti busniess e tutti i loro bisogni v'è non domanda che un modello completamente strutturato e progettato correttamente è importante e non v'è alcun sostituto. Tuttavia quando si tratta di reporting e ricerca Questo per me è un animale diverso. # 2 fornisce i dati fortemente tipizzato nelle classi anemici e non è così primitivo come valori hardcoded nel DataSet come # 1, e riduce ancora notevolmente la quantità di tempo necessario per completare la progettazione rispetto al # 3.

Idealmente mi piacerebbe estendere il mio modello di oggetti fino a comprendere tutte le esigenze di reporting, ma a volte lo sforzo necessario per fare questo è così vasto, che la creazione di un insieme separato di classi solo per la segnalazione esigenze è una scelta più facile, ma ancora vitale. Io in realtà chiesto a questa domanda quasi identica a pochi anni fa ed è stato anche detto che la creazione di un altro insieme di classi (essenzialmente DTOs) per la segnalazione di necessità non è stata una cattiva scelta.

Quindi, per avvolgerlo, # 3 è tecnicamente l'opzione migliore, ma # 2 è probabilmente l'opzione più realistica e praticabile se si considera il tempo e la qualità insieme per la segnalazione complessa e esigenze di ricerca.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top