Wystarczy stworzył acc na SO zapytać to :)W podejściu DDD, czy ten przykład jest poprawnie modelowany?
Zakładając ten uproszczony przykład: budowania aplikacji internetowej do zarządzania projektami ...
Aplikacja posiada następujące wymogi/zasady.
1) Użytkownicy powinni mieć możliwość tworzenia projektów wstawiających nazwę projektu.
2) Nazwy projektów nie mogą być puste.
3) Dwa projekty nie mogą mieć tej samej nazwy.
Używam architektury 4-warstwowej (interfejs użytkownika, aplikacja, domena, infrastruktura).
Na moim warstwie aplikacji mam następujące klasy 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);
}
}
Na mojej domenie warstwy, mam klasę Project.cs oraz interfejs 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);
}
na moim Warstwa infrastruktury, mam implementację IProjectRepository, która wykonuje faktyczne zapytania (kod jest nieistotny).
nie podoba mi się dwie rzeczy o tym wzorem:
1) Czytałem, że repozytorium interfejsy powinny być częścią domeny, ale implementacje nie powinno. To nie ma dla mnie sensu, ponieważ uważam, że domena nie powinna wywoływać metod repozytorium (ignorancja uporczywości), która powinna być odpowiedzialnością usług w warstwie aplikacji. (Coś mi mówi, że się mylę).
2) Proces tworzenia nowego projektu wymaga dwóch walidacji (nie zerowych i nie duplikowanych). W moim projekcie powyżej te dwa walidacje są rozproszone w dwóch różnych miejscach, co utrudnia (imho) obserwowanie, co się dzieje.
Moje pytanie brzmi, czy z perspektywy DDD jest to prawidłowo modelowane, czy zrobiłbyś to w inny sposób?
Jeśli chodzi o (1), myślę, że moja warstwa aplikacji mogłaby służyć do celów warstwy serwisowej, gdybym miał kolejną warstwę, myślę, że mógłbym skończyć z warstwami bez znaczenia i odpowiedzialności dzielonych między warstwami. Kiedy mówisz o złożoności projektu, całkowicie się z Tobą zgadzam. W większości moich aplikacji używam podejścia "Wzorzec aktywnej rekordy", a ten wzór może wydawać się bardziej odpowiedni do rozwiązania tego przykładu. Celowo opuściłem ten przykład uproszczony, ale próbuję dowiedzieć się, jak poprawnie modelować przy użyciu wzorca repozytorium, dlatego odchylam się od wzoru AR. – Tag
Jeśli chodzi o (2), twoja sugestia ma dla mnie sens i myślę, że jest to rzeczywiście najlepsza opcja w tym przypadku. – Tag