Sto vivendo una crisi architettonica filosofica di metà carriera. Vedo le linee molto chiare tra ciò che è considerato codice client (UI, Web Services, MVC, MVP, ecc.) E il livello di servizio. Le linee del livello di servizio, tuttavia, stanno diventando più sfocate di minuto in minuto. E tutto è iniziato con la possibilità di interrogare il codice con Linq e il concetto di caricamento Lazy.Queryability e Lazy Loading in C# offuscano le linee di Data Access vs Business Logic?
Ho creato un Business Layer costituito da contratti e implementazioni. Le implementazioni potrebbero quindi avere dipendenze da altri contratti e così via. Questo viene gestito tramite un contenitore IoC con DI. C'è un servizio che gestisce il DataAccess e tutto ciò che fa è restituire un UnitOfWork. Questo UnitOfWork crea una transazione quando viene estesa e impegna i dati nel metodo Commit. [View this Article (Testability and Entity Framework 4.0)]:
public interface IUnitOfWork : IDisposable {
IRepository<T> GetRepository<T>() where T : class;
void Commit();
}
Il Repository è generico e lavora contro due implementazioni (EF4 e un InMemory DataStore). T è costituito da POCO generati dallo schema del database o dai mapping EF4. La testabilità è incorporata nel design del repository. Possiamo sfruttare l'implementazione in-memory per affermare i risultati con le aspettative.
public interface IRepository<T> where T : class {
IQueryable<T> Table { get; }
void Add(T entity);
void Remove(T entity);
}
Mentre l'origine dati è astratta, IQueryable mi dà ancora la possibilità di creare query dove voglio all'interno della logica di business. Ecco un esempio.
public interface IFoo {
Bar[] GetAll();
}
public class FooImpl : IFoo {
IDataAccess _dataAccess;
public FooImpl(IDataAccess dataAccess) {
_dataAccess = dataAccess;
}
public Bar[] GetAll() {
Bar[] output;
using (var work = _dataAccess.DoWork()) {
output = work.GetRepository<Bar>().Table.ToArray();
}
return output;
}
}
Ora è possibile vedere come le query potrebbero diventare ancora più complesse quando si eseguono join con filtri complessi.
Pertanto, le mie domande sono:
- importa che non esiste una chiara distinzione tra BLL e DAL?.
- La queryabilità considera l'accesso ai dati o la logica aziendale quando si trova dietro un livello del repository che si comporta come un'astrazione InMemory?
Aggiunta: Più ci penso, forse la seconda domanda era l'unica che avrebbe dovuto essere posta.
+1 per il primo punto, in particolare – arootbeer
+1. Scopo in primo luogo, filosofia secondo. –
Il tuo primo punto è la mia preoccupazione. Anche se EF4 è in grado di creare oggetti di dominio sudo con le sue capacità di mappatura, se si apportano modifiche nello schema del database, è molto probabile che si desideri propagare tali modifiche agli oggetti EF4, influenzando così la logica aziendale. Questo impatto può essere minimizzato eseguendo una regressione sui test delle unità. Ma un cambiamento è un cambiamento. –