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 class DomainEntityB
{
public string Name { get; set; }
public IList<DomainEntityA> DomainEntityAList { get; set; }
}
지금 우리의 질문에 온다 : OtherInformation는 다음이 포함
public interface IDomainEntityBService
{
DomainEntityB GetDomainEntityB();
}
. 우리는 다음과 같이 OtherInformation을 유지하기 위해 저장소를 사용하여 조사하고 있습니다 :
public interface IDomainEntityBRepository
{
void Add(DomainEntityB information);
DomainEntityB Get(long someId);
}
우리는 우리가 이상적으로 DomainEntityB에 대한 DomainEntityAList의 목록을 검색 IDomainEntityAService의 논리를 재사용 할 것이다 가능한 한 드라이로 일을 유지하고자하기 때문에 . 어느 것이 가장 합리적인가?
A)는 IDomainEntity 브리 포세 티토 에있는 IDomainEntityAService에 대한 참조를가집니다.
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 물건을 처리하고 우리는 우리가 OtherInformation에 대한 특정 DAL 객체를 만들
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) MyObjects의 목록을 채우는 IHaveOtherInformation에 대한 서비스 레이어를 사용하고 우리가를 사용 서비스 계층은 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는 DomainEntityA의 목록 없이는 살 수 없습니다.
DomainEntityB의 DomainEntityA 항목 목록을로드하고 DomainEntityA의 모든 로직을 유지하는 방법은 무엇입니까?
DomainEntityBService에서 DomainEntityAService를 다시 사용 하시겠습니까?
DomainEntityBService에 별도의 DomainEntityARepository를 만드시겠습니까?
우리는 현재 EntLib을 사용하고 있지만 DAL 구현에 대한 자세한 내용은 디자인 정보를 참조하십시오.
이 질문에 대한 답은 어떤 DAL 구현을 사용해야합니까? 왜 그렇게 Entlib에 설정되어 있습니까? –
특정 DAL 구현으로이 작업이 더 쉬워 진 경우 모든 작업을 수행 할 수 있습니다. 우리는 과거에 Entlib을 사용했고 Repository 패턴과 함께 사용하려고했습니다. –