6

Sto cercando di essere uno sviluppatore migliore ...separazione degli interessi Pattern Repository & Entity Framework 3.5

quello che sto lavorando con:

  1. .Net MVC Framework 1.0
  2. Entity Framework 3,5

ho fatto qualche lettura e penso che quello che voglio fare è:

  1. Creare un repository per ciascun aggregato nel dominio. Un repository di ordini, ad esempio, gestirà gli OrderItem di un ordine.
  2. Creare un livello di servizio per gestire la business logic. Ogni repository avrà un oggetto di servizio corrispondente con metodi simili.
  3. Creare DTO tra il repository e il servizio
  4. Possibilmente creare ViewModels che sono classi da utilizzare per la visualizzazione.

Ho un repository un'interfaccia base che le mie interfacce repository aggregati attueranno ...

public interface IRepository<T> 
    { 
     IEnumerable<T> ListAll(); 
     T GetById(int id); 
     bool Add(T entity); 
     bool Remove(T entity); 
    } 

mio Ordine interfaccia Repository è definito come segue ... ci saranno probabilmente altri metodi, come ho più in questo esercizio di apprendimento.

public interface IOrderRepository : IRepository<Order> 
{ 
} 

Le mie classi di servizio sono essenzialmente definite come i repository, tranne per il fatto che ogni implementazione di servizio include la logica di business. I servizi avranno un'interfaccia repository nel costruttore (non sono pronto per IoC in questo esercizio, ma credo che sia dove vorrei finire in fondo alla strada).

  1. Le implementazioni del repository eseguiranno il push e il pull dal database utilizzando Entity Framework. Quando si recuperano dati; i metodi restituiranno solo i DTO e non gli oggetti EF generati
  2. I servizi (come li chiamo loro) controlleranno il repository ed eseguiranno la logica di business. I servizi sono ciò che vedrai nel controller, ad esempio _orderService.GetById (1).
  3. Questo è il punto in cui ho iniziato a capovolgere e potrei usare qualche feedback ... dovrei forse avere le mie classi di servizio per popolare classi ViewModel ... non dovrei avere classi ViewModel .... forse è troppa mappatura da un tipo ad un altro?

Mi piacerebbe avere un riscontro sulla direzione che sto seguendo per quanto riguarda la separazione delle preoccupazioni.

Grazie

+0

Ho cercato di fare lo stesso, ma non riesco a pensare a un buon modo per gestire il metodo di inclusione di EF? –

+0

P.S. Sei sicuro di voler dire EF 3.5? Penso che la versione 1 sia la versione corrente e la versione 2 sia in versione beta. Oppure, sto usando una versione v vecchia di esso. –

+0

EF 3.5 = versione 1, EF 4.0 = versione 2 – bobwah

risposta

1

penso che ci si sta muovendo nella giusta direzione sul modello Repository. Per quanto riguarda la tua domanda sulle classi ViewModel, ti suggerisco di utilizzare qualcosa che trasformi l'output degli output del metodo di servizio aziendale in alcuni output desiderati. Ad esempio, il servizio aziendale dell'Ordine potrebbe avere un metodo chiamato GetOrders(). Utilizzando un attributo personalizzato è possibile definire il tipo di classe di visualizzazione per esso. La vista è in grado di ottenere l'output di questo metodo, se possibile si unisce ad altri tipi di dati e restituisce il risultato come una raccolta di oggetti con tipi anonimi.In questo caso la vista assumerà IQueryable<Order> o IEnumerable<Order> come input e restituirà IList come output.

Questo metodo è di grande aiuto quando è necessario mostrare diversi tipi di viste dei dati sul lato client. Abbiamo già utilizzato qualcosa di simile (ma più complesso) a questo metodo nella struttura della nostra azienda.

+1

Grazie per il feedback. Questo suggerimento sembra molto interessante. Stai sostanzialmente dicendo che potrei creare un attributo personalizzato che fornirà un altro modo di guardare i dati ... proprio come una vista? Se è così, puoi indicarmi la direzione giusta per questo concetto. Sembra che potrebbe essere una grande idea. Inoltre, quando il repository restituisce oggetti DTO, generalmente hanno lo stesso nome degli oggetti EF generati ... suggeriresti semplicemente di utilizzare una convenzione di denominazione diversa per le DTO per evitare conflitti di tipo? – Craig

+1

Un modo per farlo è creare un ViewModel per View. Dove le classi ViewModel sono solo aggregati dei dati che voglio mostrare. Non vedo alcun problema con lo spostamento delle entità ORM attraverso questi ViewModels, ma se questo ti mette a disagio, puoi sempre inserire i modelli ORM in un altro assieme e renderli privati. Quindi usa qualcosa come StuctureMap per trasformarli in ViewModel e nei suoi dati. – Kris

+0

L'attributo personalizzato consente di definire diversi modelli di visualizzazione possibili per i metodi del servizio aziendale. Quindi l'output di quel metodo sarà alimentato al modello di visualizzazione e si occuperà di generare l'output desiderato. Per implementare questo comportamento è necessaria una classe proxy per il servizio aziendale che chiama il metodo desiderato, estrae il nome della vista appropriato dai metadati, passa l'output aziendale alla vista e restituisce l'output della vista. –

Problemi correlati