Immagina, abbiamo moduli di test con un gran numero di domande e possiamo creare test che conterranno esattamente 30 domande.
public class Module
{
public long Id { get; set; }
public List<Question> Questions { get; set; } // all questions
}
public class Test
{
public long Id { get; set; }
public List<Question> Questions { get; set; } // exactly 30 per attempt
}
Questo è quello che farei di solito:
public class QuestionsRepository
{
public Question[] GetRandomQuestions(int count)
{
return context.Set<Question>()
.Where(x => x.Status == QuestionStatus.Active)
.OrderBy(x => Guid.NewGuid())
.Take(count)
.ToArray();
}
}
public class TestService
{
public Test StartNewTest()
{
// take random 30 and build a new test
return new Test
{
Questions = questionsRepository.GetRandomQuestions(30)
};
}
}
Tuttavia, ciò significa che disponiamo di modelli di dominio anemici e che la logica del dominio sta filtrando nel repository, sa quale stato deve essere attivo, che prendiamo solo un numero limitato di domande ecc.
Questo è quello che mi aspetto che DDD assomigli:
public class Module
{
public long Id { get; set; }
public List<Question> Questions { get; set; } // all questions
public Test StartNewTest(int questionsCount)
{
return new Test
{
Questions = Questions
.OrderBy(x => Guid.NewGuid())
.Take(questionsCount)
.ToArray();
};
}
}
public class TestService
{
public Test StartNewTest()
{
var module = moduleRepository.GetDefaultModule();
return module.StartNewTest();
}
}
Ora, la logica di dominio è contenuta in Modelli di dominio.
Tuttavia, questo significa che tutte le domande verranno caricate in memoria con impazienza e quindi verranno filtrate come IEnumerable
che potrebbe essere molto inefficiente se avessimo un numero di domande elevato.
Come si implementa il modello di dominio ignorante alla persistenza rendendo tutte le query SQL efficienti e ottimali? Non riesco a capire come progettare DDD senza perdite di logica di dominio nei repository.