저는 합리적으로 '순수한'DDD 응용 프로그램을 작성하고 있습니다. CQRS를 사용하지 않습니다. 지속성은 EF6을 사용하는 인프라 서비스입니다.Entity Framework 및 DDD를 사용할 때 새 객체를 인스턴스화하는 방법은 무엇입니까?
이제 유형 A의 새 항목을 만들고 다른 항목 (B)의 탐색 속성 모음에 추가해야하는 몇 가지 방법이 있다고 가정 해 보겠습니다. 이 방법은 도메인 어셈블리 어딘가에있을 수도 있고 응용 프로그램 서비스 어셈블리에있을 수도 있습니다.
작은 응용 프로그램을 작성하는 경우 DBSet.Create 메서드를 호출하여 프록시 객체 (지연로드 사용)에 대한 참조를 확보 한 다음 B의 탐색 속성에 추가 할 수 있습니다.
그러나 내 응용 프로그램과 도메인 어셈블리가 내 영속성을 위해 EF를 사용하고 있다는 것을 기쁜 마음으로 생각하면 게으른 로딩을 중단하지 않도록하려면 어떻게해야합니까? 방금 A의 생성자를 호출하면 프록시 객체가 없습니다. 내 응용 프로그램 서비스에서이 사실을 처리해야합니까 (모든 잘못 생각한 것), 아니면 생성자를 보호 한 다음 해당 도메인/응용 프로그램 서비스에 팩토리를 전달해야합니까?
편집 : 잘못하고 있습니까? 아마도 다음과 같이 내 문제를 줄이거 나 없앨 수 있습니다.
- EF의 탐색 모음에 추가하고 저장 한 다음 다른 쪽 끝을 채우는 데 익숙합니다. 그러나, DDD에서, 생성시에, 나는 새로운 엔티티가 가지고있는 관계의 양쪽 끝을 채워야한다고 생각합니다. 이렇게하면 내 탐색 문제가 해결됩니다.
- 프록시 개체가 여전히 필요합니까? 나는 대부분의 경우에, 아닙니다 짐작하고있다. 새로운 엔터티를 지속하는 트랜잭션이 발생할 때까지 DB에서 아무 것도 가져올 필요가 없습니다.
- 만약 내가 Create (Insert) 트랜잭션 이상으로 DBContext의 수명을 유지하려고한다면, 내 영속 계층에 새로운 엔티티를 DBContext에 추가 할 필요가 있습니다.), 또는 DBContext의 DBSet.Create 메서드를 사용할 팩터 리에 대한 생성자 함수로 전달하십시오.
왜 새 엔터티에 프록시 개체가 필요합니까? 그것은 곧 삽입 될 것입니다. 제 생각에는 응용 프로그램 서비스 나 도메인에있을 수 있습니다. 예를 들어, 새 오브젝트가 집계의 일부인 경우, 집계가 작성을 담당합니다. – jannagy02
안녕하세요, 감사합니다. 컬렉션에서 null 참조 예외를 피하려면 프록시 객체가 필요합니다. 왜 그런지는 중요하지 않습니다.이 지속성 문제가 도메인에 누출되는 것을 막는 방법에 대한 자세한 내용입니다. 저는 대답이 합격 된 공장이어야한다고 생각합니다. 이는 응용 프로그램 서비스에서 사용하는 것입니다. – Chalky
타입 A의 새로운 엔티티를 생성하고 그것을 다른 엔티티 (B)의 네비게이션 프로퍼티 콜렉션에 추가하기를 원한다면 그냥하라. 도메인은 여전히 지속성이 유지되지 않습니다. 데이터베이스에 없으므로 지연로드가 필요하지 않으며 SaveChanges를 호출 할 때 EF가 삽입합니다. – jannagy02