Nel contesto dell'applicazione n-tier, c'è una differenza tra ciò che considerereste le vostre classi di accesso ai dati e i vostri repository?Repository vs Data Access
Tendo a pensare sì ma volevo solo vedere quale altro pensiero. Il mio pensiero è che il lavoro del repository è solo per contenere ed eseguire la query raw stessa, dove come la classe di accesso ai dati creerebbe il contesto, eseguire il repository (passando nel contesto), gestire il mapping del modello di dati al modello di dominio e restituisci il risultato ...
Cosa ne pensate? Vedete anche questo cambiamento in uno scenario da Linq a XML (assumendo che si cambi il contesto per il relativo XDocument)?
Saluti Anthony
UPDATE:
Questo è il modo in cui avrei tipicamente implementato cose in precedenza:
public class TermBl : ITermBl
{
public IEnumerable<ITerm> GetAll(IListParameter criteria)
{
//Any pre business logic
var dataLayer = this.CreateDataLayer();
var result = dataLayer.GetAll(criteria);
//Any post business logic
return result;
}
... Other methods
}
public class TermDa : ITermDa
{
public IEnumerable<ITerm> GetAll(IListParameter criteria)
{
//Linq query
var dataResult = ....ToList()
var mappedResult = this.FromDataToDomain(dataResult);
//Note the mapping isn't done in this object, the actual
// mapping is handled by a separate component
return mappedResult;
}
... Other methods
}
Vede qualche problemi inerenti qui con il modello in generale ..
Per quanto riguarda il repository in cui ho pensato di utilizzarlo è invece di avere la query direttamente nel GetAll di TermDa Metodo vorrei cambiare farlo sembrare qualcosa di più simile a questo:
public class TermDa : ITermDa
{
public IEnumerable<ITerm> GetAll(IListParameter criteria)
{
var repository = this.CreateRepository();
var dataResult = repository.GetAll(..., criteria).ToList();
var mappedResult = this.FromDataToDomain(dataResult);
return mappedResult;
}
... Other methods
}
public class TermRepository : ITermRepository
{
public IQueryable<ITerm> GetAll(IMyContext context, IListParameter criteria)
{
//Linq query
return ...;
}
... Other queries
}
È così che ragazzi vederlo lavorare o no davvero ... Con o senza il repository che vedo uno di quanto sopra totalmente protezione dello strato di business da sapere tutto sui metodi di accesso ai dati/tecnologia utilizzata ...
Quindi si vede un oggetto DAL che utilizza un oggetto repository? per esempio quando dici di emettere query, penso che lo farebbe chiamando il repository ... quasi come se il repository fosse un proxy per i proc memorizzati in un database, eccetto che le query sono nel repository ... –
@vdh_ant: No , un DAL in genere non ha alcuna conoscenza del modello di dominio. L'implementazione di un repository (non la sua interfaccia/tipo di base) potrebbe utilizzare il DAL, anche se la maggior parte dei nuovi progetti oggi non ha nemmeno un DAL, è tutto incapsulato in un ORM.Il repository è ** non ** un proxy per gli oggetti del database, hai frainteso quello che è. – Aaronaught
@Aaronaught: mettere da parte il repository per un secondo, quando dici "DAL in genere non ha alcuna conoscenza del modello di dominio" questo va contro ciò che ho visto in giro per il luogo ... pensando da una prospettiva interfaccia/contratto il DAL deve restituire qualcosa e ho visto soprattutto che qualcosa deve essere il modello di dominio. Quando penso a cos'altro potrebbe essere, potrebbero essere solo i modelli di dati ... Avrei pensato che questo fosse negativo per diverse ragioni. Soprattutto perché il tuo livello di business logic è ora abbinato a un modello di dati che è specifico per diverse tecnologie ... –