Sto cercando di capire come funziona DDD ma sono bloccato. Ecco come ho impostato il mio progetto:
Data Access Layer
-Entity models that map to the db
-Db connection stuff
-Repositories implementations
Domain Layer
-Models that represent the DAL entity models
-Repositories interfaces
Application Layer
-MVC application that uses Domain models
Il primo problema che vedo qui è che i modelli di dominio sono esattamente gli stessi dei modelli di entità e ho un problema serio con questo: i modelli di entità hanno ovviamente la convalida configurata in essi, cose come "lunghezza massima", " nullable "," required ", ecc. Ora, per conformarmi a ciò che capisco è DDD, non posso usare direttamente questi modelli da nessuna parte, ad eccezione del DAL, quindi ho creato il mio livello di dominio. Nel livello del dominio, ho tutte queste regole di convalida duplicate per la convalida dell'interfaccia utente, e ciò che è ancora peggio è che se devo cambiare una regola, dovrò cambiarla in due punti: il DAL e il dominio.
Esempio:
User Entity in DAL
Name (required)
Last name (required)
Email (required, maxlen 120)
Username (required, maxlen 120)
User Domain Model
Name (required)
Last name (required)
Email (required, maxlen 120)
Username (required, maxlen 120)
Un'altra cosa che trovo molto strana è l'organizzazione dei repository in questa architettura. Seguendo ciò che ho letto, ho creato un'interfaccia GenericRepository e un'interfaccia UserRepository, che eredita il GenericRepository, il tutto nel livello Domain. Ho implementato il GenericRepository nel DAL e l'implementazione crea un DAO per il tipo di entità utilizzata per creare il repository. Fin qui, tutto bene.
Quindi, ho implementato il UserRepository, e qui ho un altro problema: l'interfaccia UserRepository si aspetta il modello Domain User e quando cerco di implementare l'interfaccia nel DAL, devo implementarlo usando il modello Domain User , che causa la creazione del DAO per un modello di dominio, non un modello DAL, e questo non ha alcun senso. L'unico da risolvere sarebbe quello di fare riferimento al DAL nel livello Dominio, che è sbagliato.
Domain Layer:
public interface IGenericRepository<TEntity>
{
TEntity FindById(TKey id);
}
public interface IUserRepository : IGenericRepository<Domain.User>
{
Task<User> FindByUserNameAsync(string userName);
}
DAL:
public abstract class GenericRepository<TEntity> : IGenericRepository<TEntity>
{
protected DbContext ctx;
protected DAO<Entity> dao;
public GenericRepository(DbContext context)
{
ctx = context;
dao= ctx.Dao<TEntity>();
}
public virtual TEntity FindById(TKey id)
{
return dao.Find(id);
}
}
public class UserRepository : GenericRepository<Domain.Models.User>, IUserRepository
{
public UserRepository(DbContext context)
: base(context)
{
// THIS WILL CREATE A DAO FOR A DOMAIN MODEL
}
// rest of code...
}
Qualcuno può far luce su ciò che mi manca nel DDD?