appena creato un secondo su SO a chiedere questo :)In un approccio DDD, questo esempio è modellato correttamente?
Assumendo questo esempio semplificato: la costruzione di un'applicazione web per gestire i progetti ...
L'applicazione ha i seguenti requisiti/regole.
1) Gli utenti devono essere in grado di creare progetti inserendo il nome del progetto.
2) I nomi dei progetti non possono essere vuoti.
3) Due progetti non possono avere lo stesso nome.
Utilizzo un'architettura a 4 livelli (Interfaccia utente, Applicazione, Dominio, Infrastruttura).
Sul mio Application Layer ho la seguente classe ProjectService.cs:
public class ProjectService
{
private IProjectRepository ProjectRepo { get; set; }
public ProjectService(IProjectRepository projectRepo)
{
ProjectRepo = projectRepo;
}
public void CreateNewProject(string name)
{
IList<Project> projects = ProjectRepo.GetProjectsByName(name);
if (projects.Count > 0) throw new Exception("Project name already exists.");
Project project = new Project(name);
ProjectRepo.InsertProject(project);
}
}
Sul mio strato di dominio, ho la classe Project.cs e l'interfaccia IProjectRepository.cs:
public class Project
{
public int ProjectID { get; private set; }
public string Name { get; private set; }
public Project(string name)
{
ValidateName(name);
Name = name;
}
private void ValidateName(string name)
{
if (name == null || name.Equals(string.Empty))
{
throw new Exception("Project name cannot be empty or null.");
}
}
}
public interface IProjectRepository
{
void InsertProject(Project project);
IList<Project> GetProjectsByName(string projectName);
}
Sul mio Livello infrastruttura, ho l'implementazione di IProjectRepository che esegue l'interrogazione effettiva (il codice è irrilevante).
non mi piace due cose su questo progetto:
1) Ho letto che le interfacce repository dovrebbe essere una parte del dominio, ma le implementazioni non dovrebbe. Questo non ha senso per me dal momento che penso che il dominio non dovrebbe chiamare i metodi di repository (ignoranza di persistenza), che dovrebbe essere una responsabilità dei servizi nel livello dell'applicazione. (Qualcosa mi dice che sono terribilmente storto.)
2) Il processo di creazione di un nuovo progetto prevede due convalide (non nulle e non duplicate). Nel mio progetto sopra, quelle due convalide sono sparse in due luoghi diversi, rendendo più difficile (imho) vedere cosa sta succedendo.
Quindi, la mia domanda è, dal punto di vista del DDD, è modellato correttamente o lo si farà in un modo diverso?
Per quanto riguarda (1), penso che il mio livello di applicazione potrebbe servire allo scopo di un livello di servizio, se avessi un altro strato penso che potrei finire con livelli senza significato o responsabilità condivisa tra i livelli. Quando parli della complessità del design, sono completamente d'accordo con te. Ho usato un approccio 'Active Records Pattern' per la maggior parte delle mie applicazioni, e quel pattern potrebbe sembrare più adatto a risolvere questo esempio. Ho intenzionalmente lasciato questo esempio semplicistico, ma sto cercando di imparare come modellare correttamente usando un modello di deposito, ecco perché mi sto allontanando dal pattern AR. – Tag
Per quanto riguarda (2), il tuo suggerimento ha perfettamente senso per me e penso che sia davvero l'opzione migliore in questo caso. – Tag