2

2 개의 엔티티 - 사용자 및 그룹을 상상해보십시오. 사용자는 항상 하나의 그룹에 속하며 그룹에는 항상 수퍼 유저 한 명이 있습니다. 이 엔티티 클래스는 데이터 만 보유합니다 (논리가 없음).데이터 매퍼 패턴의 Symfony의 의존성 주입 구성 요소에 대한 순환 의존성

두 엔티티에는 모두 Mapper 클래스 (SQL 쿼리 처리)가 있습니다. UserMapper 및 GroupMapper. 그것을 위해 쿼리하는 기업의 경우 모두 서로에 의존 :

  • 사용자에 대해 쿼리 할 때 사용자의 $ 그룹 그룹 쿼리 할 때 그룹의 $ 수퍼 유저를 검색 할 수 UserMapper을 필요로 GroupMapper
  • 를 검색 할 수 GroupMapper을 필요로 UserMapper

저는 Symfony의 의존성 주입 컴포넌트를 사용하여 생성자에 의존성을 주입했습니다. 그러나이 경우 나는이 접근법에 문제가 생겼다. 나는 이것을 처리 할 Doctrine과 같은 ORM을 사용할 수 있다는 것을 알고 있지만, 현재로서는 옵션이 아닙니다. 이 문제에 대한 가장 깨끗한/최상의 해결책은 무엇입니까? 여기

는 방식의 그림 :

Problem illustration

답변

0
하나는 아마도 이것에 대한 접근 방식은 다음과 같이 세 번째 서비스 SL을 소개하고 주입하는 것입니다

:

  • 매퍼 인터페이스입니다
  • GroupMapper는 Mapper를 구현하고 주사로 SL을 수신합니다.
  • UserMapper는 Mapper를 구현하고 SL을 다음과 같이 수신합니다.
    • 기능 레지스터 ($ 이름 매퍼 m)
    • 함수 GET ($ 명) : 배제 력
    • SL 메소드 갖는다 매퍼
  • GroupMapper :: __ 구조체 (SL을 $의 SL ...)는 다음과 같은 것을 포함합니다 :
    • $ this-> sl = $ sl;
    • $ this-> sl-> register ('group', $ this);
  • UserMapper는 :: __ 구조 (SL의 $의 에스엘, ...) 같은 것을 포함
    • $ this-> SL = $ SL;
    • $ this-> SL-> ('사용자'$이)를 등록

그리고, 가정 UM $ UserMapper의 인스턴스가 DIC 수득하고, 그룹 매퍼를 사용할 필요가있다 service : $ um-> sl-> get ('user')는 그룹 매퍼를 반환합니다.

본질적으로 이것은 서비스 로케이터를 구현하는 것입니다. 서비스 로케이터는 실제로 좋지는 않지만 작은 DIC의 본질적으로 필터링 된 하위 집합이라는 장점이 있습니다. 상호 종속적 인 모든 서비스가 초기화되기 전에 두 서비스 중 하나를 사용하지 않는 한 작동합니다. 일부 상황에 적합하지 않을 수 있습니다.

또 다른 가능성은 당신의 서비스를 ContainerAware로 만들고 그것을 동일하게 사용하는 것입니다.하지만 IMHO 조금 더 짧지 만, 어떤 통제없이 DIC의 어떤 것도 본질적으로 사용할 수 있기 때문에 더 나쁩니다. 내가 제안하는 패턴은 "접촉면"을 최소화합니다.

+0

예, 내 솔루션은 이전과 거의 비슷했습니다. 나는 그것에 대해 생각할 시간이 있었고 (1 년 넘게, hehe), Lazy Load Proxy를 사용하는 세 번째 솔루션이 있다고 생각한다. 궁극적 인 해결책은 2 단계 설정 기 주입이라고 생각하지만 DI 구성 요소 소스를 수정해야합니다. –