Мы пытаемся найти наилучшую практику при использовании DDD, и мы ведем некоторые дискуссии о том, что является наиболее разумным или является «правильным путем».
Примечание. Весь код является псевдокодом.
Conceder следующее:
public interface IDomainEntityAService
{
void CreateMyObject(DomainEntityA myobject);
DomainEntityA RetrieveDomainEntityA(long someId);
//Other operations that handle the business logic dealing with MyObject
}
У нас также есть другая служба, которая использует части IDomainEntityAService для удовлетворения особых потребностей.
public interface IDomainEntityBService
{
DomainEntityB GetDomainEntityB();
}
где OtherInformation содержит следующее:
public class DomainEntityB
{
public string Name { get; set; }
public IList<DomainEntityA> DomainEntityAList { get; set; }
}
Теперь приходит наш вопрос. Мы планируем использовать хранилище для сохранения OtherInformation, как показано ниже:
public interface IDomainEntityBRepository
{
void Add(DomainEntityB information);
DomainEntityB Get(long someId);
}
Поскольку мы хотим, чтобы все было как можно более СУХИМ, в идеале мы хотели бы повторно использовать логику IDomainEntityAService для получения списка DomainEntityAList для DomainEntityB. Какой из них имеет наибольшее значение?
A) иметь ссылку на IDomainEntityAService в IDomainEntityBRepository
например,
public class SqlDomainEntityBRepository : IDomainEntityBRepository
{
public SqlDomainEntityBRepository(IDomainEntityAService domainEntityAService, Database database)
{
}
public void Add(DomainEntityB information)
{
//save DomainEntityB to SQL
}
public DomainEntityB Get(long someId)
{
//Get OtherInformation.Name from SQL
//use domainEntityAService.Get() to populate the list of DomainEntityAList
//return DomainEntityB
}
}
B) IDomainEntityBRepository обрабатывает только содержимое SQL, и мы используем служебный уровень для IHaveOtherInformation, чтобы заполнить список MyObjects
public class DomainEntityBService : IDomainEntityBService
{
public DomainEntityBService(IDomainEntityAService domainEntityAService, IDomainEntityBRepository repo)
{
}
public DomainEntityB GetDomainEntityB()
{
var domainEntityB = _repo.Get(someId);
domainEntityB.DomainEntityAList = _domainEntityAService.GetAll(someId);
return domainEntityB;
}
}
C) Мы создаем специальный объект DAL для OtherInformation и используем уровень обслуживания для создания экземпляра OtherInformation
public class DomainEntityBDAL
{
public string Name { get; set; }
public IList<int> DomainEntityAListIds { get; set; }
}
Тогда у нас будет хранилище для извлечения OtherInformationDAL, и тогда код будет выглядеть следующим образом:
public class DomainEntityBService : IDomainEntityBService
{
public DomainEntityBService(IDomainEntityAService domainEntityAService, IDomainEntityBRepository repo)
{
}
public DomainEntityB GetDomainEntityB()
{
var domainEntityBDAL = _repo.Get(someId);
DomainEntityB result = new DomainEntityB() { Name = domainEntityBDAL.Name };
foreach (var id in domainEntityBDAL.DomainEntityAListIds)
{
result.DomainEntityAList.Add(_domainEntityAService.Get(id));
}
return result;
}
}
D) Вау, мы совсем не в себе, сделайте это вместо этого !!!
Надеюсь, это имеет смысл, и спасибо за вашу помощь.
Редактировать заметки:
Возможно, английское описание поможет лучше описать мой вопрос. У нас есть DomainEntityA, который является совокупным корнем. Существует соответствующий сервис для обработки всей логики, которая имеет дело с DomainEntityA.
Теперь у нас также есть DomainEntityB, который является совокупным корнем. Однако DomainEntityB имеет список DomainEntityAs. DomainEntityAs может жить самостоятельно, однако DomainEntityB не может жить без списка DomainEntityAs
Как бы мы загрузили список элементов DomainEntityA в DomainEntityB и сохранили всю логику для DomainEntityA.
Повторно использовать DomainEntityAService в DomainEntityBService?
Создать отдельный DomainEntityARepository в DomainEntityBService?
В настоящее время мы используем EntLib, но ищем больше информации о дизайне, чем о реализации DAL.