엔티티 프레임 워크 및 빈혈 도메인 모델 피하기


11

비즈니스 로직에서 때때로 다음과 같이 정의 된 메소드가 있습니다.

User.ResetCourse(Course courseToReset)

문제는 User와 Course가 모두 Entity Framework 프록시 개체라는 것입니다. 즉, User 또는 Course에서 탐색 속성에 도달하면 데이터베이스에 큰 타격을 줄 수 있으며 이러한 개체는 IQueryable이 아니므로 정상적으로 반복됩니다.

이를 해결하기 위해 서명을 다음과 같이 변경했습니다.

User.ResetCourse(MyDBContext db, Course courseToReset)

즉, 데이터베이스를 직접 쿼리하여 효율적으로 필요한 변경을 수행 할 수 있지만 데이터베이스 컨텍스트를 비즈니스 오브젝트에 전달하는 것은 매우 잘못된 것 같습니다.

나중에 서비스 계층을 사용자에게 마이그레이션하여 다음과 같은 것을 의미합니다.

CourseService.ResetForUser(Course courseToReset, User forUser)

이 서비스는 작성시 삽입 된 DBContext에 대한 참조를 갖지만 이제 비즈니스 오브젝트는 동작이없는 데이터 백입니다 (예 : 빈혈 도메인 모델).

우리는 이것을 어떻게 피할 수 있습니까?


11
엔터티 프레임 워크 모델이 실제로 DTO이며 실제로 도메인 모델이 아니라는 사실을 깨달았습니다. 실제로 DDD를 시도하고 있습니까? 그렇지 않다면 아마 중요하지 않을 것입니다.
Mr Cochese

3
ADM 플러스 서비스는 많은 것들을위한 훌륭한 아키텍처입니다
Ewan


2
@JohnWu는 매우 편향된 기사입니다. 실제로 리치 예제에 Active Record 패턴을 포함시켜 리치 도메인 모델의 "Strawman"버전을 포함합니다. 확실히, Active Record는 DDD에서 지원되지 않으며 일반적으로 복잡한 응용 프로그램에는 적합하지 않습니다.
RibaldEddie

답변:


8

문제는 EF 객체를 먼저 도메인 객체로 사용한다는 것입니다. EF 객체는 비즈니스 모델이 아닌 데이터 모델입니다.

필요에 따라 자유롭게 수행 할 수있는 비즈니스 오브젝트를 선언 한 후이를 리포지토리를 사용하여 검색하고 저장해야합니다. 리포지토리는 EF 엔터티를 비즈니스 엔터티에 매핑합니다. EF 객체는 리포지토리 외부에서 사용해서는 안됩니다.


0

다음과 같은 작업을 수행하여 피할 수 있습니다.

CourseService.prepareForUserCourseReset(DBContext db);
User.reset();
Course.reset();
CourseService.completeUserCourseReset(DBContext db);

어쨌든 내 드리프트를 잡으면 그 효과에 영향을 줄 수 있습니다. 설명 된 초기 방법으로 수행 한 접근 방식은 성능 과 관련이 있으며 도메인 구조와 관련이있는 것은 아닙니다. 따라서 실제로 서비스 계층에서 성능 문제를 해결하는 것을 고려해야하지만 도메인에서 동작을 유지할 수 있습니다. 더 나은 답변을 원한다면이 맥락에서 사용자 / 코스를 재설정하는 것이 무엇을 의미하는지 아는 것이 도움이 될 것입니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.