Avevo creato un'infrastruttura il nostro nuovo progetto intranet nuovo di zecca e ho cercato di seguire quasi tutte le migliori pratiche. Voglio anche menzionare, questa è la mia prima volta per creare un'architettura da zero.Implementazione del contesto limite per l'infrastruttura basata su Entity
Attualmente la prima versione della mia infrastruttura è pronta e funzionante. Ma voglio implementare una struttura di contesto limitata alla prossima versione.
Ho cercato di spiegare la situazione attuale seguente.
DbCore: responsabile delle operazioni di dati. Entity Framework 5 Code Utilizzato per la prima volta. Esiste solo una classe DbContext e tutti i DbSet definiti al suo interno. Anche pattern GenericRepository e Unit of Work implementati in base alle seguenti interfacce.
IGenericRepository
public interface IGenericRepository<TEntity>
where TEntity : class {
void Delete(object id);
void Delete(TEntity entityToDelete);
System.Collections.Generic.IEnumerable<TEntity> Get(System.Linq.Expressions.Expression<Func<TEntity, bool>> filter = null, Func<System.Linq.IQueryable<TEntity>, System.Linq.IOrderedQueryable<TEntity>> orderBy = null, string includeProperties = "");
System.Collections.Generic.IEnumerable<TEntity> GetAll();
TEntity GetByID(object id);
System.Collections.Generic.IEnumerable<TEntity> GetWithRawSql(string query, params object[] parameters);
void Insert(TEntity entity);
void Update(TEntity entityToUpdate);
}
IUnitOfWork
public interface IUnitOfWork {
void Dispose();
IGenericRepository<Test> TestRepository {
get;
}
IGenericRepository<Log> LogRepository {
get;
}
void Save();
}
Modelli: responsabili modelli di entità memorizzazione per DbCore e Entity Framework Domain: Rappresentare livello di logica di business memorizza anche DTOS per entità oggetti che sono stati memorizzati nel progetto Models. Attualmente la logica di business memorizzati in classe di servizio che ha implementato seguente interfaccia IService classe
public interface IService<TEntity> {
IEnumerable<TEntity> Get();
TEntity GetByID(int id);
void Insert(TEntity entity);
}
Questo servizio diventa UnitOfWork mediante il parametro ctor e utilizzare per le operazioni. Anche Automapper è stato implementato per convertire oggetti entità in DTO o viceversa. D'ora in poi tutti i livelli superiori non sono più interessati ai modelli di entità, usano solo DTO. Quindi quasi tutti i progetti (inclusi, api e web) fanno riferimento a questo progetto.
Comune: Responsabile per l'archiviazione di librerie di uso comune come la registrazione.
WebCore: Responsabile per l'archiviazione di librerie di uso comune per progetti basati sul Web come API o MVC. Contiene inoltre estensioni, gestori e filtri per progetti basati su MVC.
Api: Il progetto API Web MVC ASP.Net rappresenta il livello di servizio. Consuma il livello del dominio e serve ai client. I controller ottengono l'interfaccia IService come parametro ctor e la usano per accedere al livello dati tramite il livello dominio.
Web: ASP.Net Progetto Web basato su MVC 4, responsabile dell'interazione con l'utente. Consuma metodi Api per accedere ai dati. Tutti i controller ottengono un'interfaccia denominata IConsumeRepository che collega API tramite HttpClient.
public interface IConsumeRepository<TEntity> {
Task<TEntity> Create(TEntity TestInfo);
Task Delete(int id);
Task<IEnumerable<TEntity>> Get();
Task<TEntity> Get(int id);
TEntity New();
Task<TEntity> Update(TEntity TestInfo, int entityId);
}
Autofac è responsabile per IoC e DI per tutti i progetti.
Per ora questa è la mia infrastruttura attuale, penso di aver spiegato tutto ciò che deve essere valutato.
Ora sto cercando di capire seguenti cose,
Domanda 1: C'è qualcosa NON DEVE essere attuati il modo in cui ho usato?
Domanda 2: Qual è l'approccio migliore per implementare contesti limitati? Di recente ho visto i video di Julie Lerman e ho recensito molti progetti campione. La cosa comune che ho visto derivare BC da DbContext. Ma non potevo esserne sicuro. Perché avevo pensato che BC dovrebbe essere nel livello dominio (business logic) non nel livello DbCore (accesso ai dati).
Domanda 3: Come accennato in precedenza, i miei progetti Api e Web utilizzano DTO in modo che entrambi debbano avere riferimenti Livello dominio. Ma non mi è piaciuto, perché sto separando il livello aziendale dall'interfaccia utente con un'API e li ho accoppiati di nuovo per le entità. Ma non sono riuscito a trovare un modo migliore di questo.
Questa è diventata una lunga domanda, ma sarò molto felice se condividi le tue idee con me per creare un'architettura migliore.
vorrebbe essere in grado di fare clic su +1 qui alcune centinaia di volte! –