문제

레거시 데이터베이스 위에 응용 프로그램을 구축하고 있습니다 (변경할 수는 없습니다). 데이터 액세스에 LINQ에서 SQL을 사용하고 있습니다. 즉, 각 테이블에 대해 (LINQ ~ SQL) 클래스가 있음을 의미합니다.

내 도메인 모델이 데이터베이스와 일치하지 않습니다. 예를 들어, 두 개의 테이블이 이름이 있습니다 Users 그리고 Employees, 따라서 두 개의 LINQ에서 SQL 클래스가 이름이 있습니다. User 그리고 Employee. 하지만 내 도메인 모델에서 나는 User 두 테이블의 일부 필드를 포함 해야하는 클래스 (그러나이 테이블의 다른 필드는 신경 쓰지 않습니다).

저장소를 어떻게 설계 해야하는지 잘 모르겠습니다.

  • 리포지토리가 LINQ에서 SQL 클래스 간의 매핑을 수행하는 경우 (예 : User, Employee) 도메인 클래스에 (User) 그리고 도메인 클래스를 응용 프로그램에만 반환합니다.
  • 또는 내 리포지토리가 LINQ를 SQL 클래스로 반환하고 매핑을 발신자에게 맡겨야합니까?

첫 번째 접근법은 나에게 더 의미가있는 것처럼 보이지만 이것이 저장소를 구현하는 올바른 방법입니까?

도움이 되었습니까?

해결책

순수 주의자 (순수한 상태를 유지하려고합니다)는 귀하의 모델이 귀하의 데이터를 나타냅니다. 그러므로 지속해야 할 일은 저장소를 통해서만 필요할 때만 이루어집니다. 또한 복잡한 엔티티가 있으면 서비스를 사용하여이를 결합하려고합니다. 예를 들어, useremployeeservice를 통해서만 액세스 할 수있는 user + employee = useremployee Entity.

모호한 진술을 통해 여기에는 훌륭한 기회가 있습니다.

반부패 계층을 구축하여 레거시 DB에서 동시에 이동할 수 있습니다.

이것은 DDD 플레이 북의 또 다른 장입니다. 반부패 층은 정면, 번역기 및 어댑터를 사용하여 레거시 시스템과 인터페이스하여 레거시 DB를 순수한 도메인 모델로 분리하는 데 사용됩니다.

이제 이것은 당신이 원하는 것보다 훨씬 더 많은 일일 수 있습니다. 따라서이 시점에서 스스로에게 물어봐야합니다.

이 레거시 DB에서 벗어나는 과정을 시작하고 싶습니까? 아니면 응용 프로그램의 수명에 남아 있습니까?

대답이 마이그레이션을 시작할 수 있다면 실제 도메인을 원하는 방식으로 모델링하십시오. 일반 저장소 및 서비스로 유지하십시오. 당신이 원하는 방식으로 그것을 디자인하는 것을 즐겁게하십시오. 그런 다음 집계 뿌리의 서비스를 사용하여 반부패 계층에 도달하고 엔티티를 꺼내고 로컬로 저장/업데이트하고 도메인의 엔티티로 번역하십시오.

대답은 레거시 DB가 프로젝트 수명을 유지한다는 것이라면 작업이 훨씬 쉽습니다. 도메인의 서비스 (예 : 사용자 인 고유 한 서비스)를 사용하여 반부패의 사용자 파견 및 EmployeeFacade ( "원격 서비스"개념과 유사)에 도달하십시오.

정면 내에서 어댑터 (예 : LegacyDBSQLDatabase)를 사용하여 레거시 DB에 액세스하여 원시 레거시 서서 ()를 얻습니다. 다음 단계는 레거시 사용자 데이터를 실제 도메인의 user () 엔티티 버전으로 변환하는 userTransLator () 및 EmployeetRansLator () 맵퍼를 사용하여 userFacade에서 useremployeeservice로 다시 반환하는 것입니다. 같은 장소에서 온 직원 단체.

우와, 그건 많은 타이핑이었다 ...

부패 방지 계층의 어댑터와 외관을 사용하면 LINQ-to-SQL 또는 원하는대로 수행 할 수 있습니다. 레거시 DB/시스템을 멋지고 순수한 도메인에서 멀리 떨어 뜨 렸기 때문에 고유 한 user () 및 Employee () 엔티티 및 값 객체가있는 도메인.

다른 팁

DDD 및 LINQ에서 SQL은 생성 된 클래스가 DB 테이블 구조에서 크게 벗어나기위한 것이 아니기 때문에 잘 어울리지 않습니다. LINQ와 협력하여 통증을 SQL로 만들거나 비 이상적인 객체 모델로 살 수있는 방식으로 클래스를 매핑해야합니다.

DDD를 실제로 활용하려면 리포지토리 패턴을 사용하려면 엔티티 프레임 워크 또는 더 나은 nhibernate로 이동하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top