2017-02-05 6 views
2

나는 해결책이 있습니다순환 종속성과 단결 컨테이너

solution

  • BusinessBusiness.Interfaces, DataAccess.InterfacesFactory에 대한 참조가을 (DataAccess.Interfaces에서 해결 IDataAccess에 대한)
  • MainProjectBusiness.Interfaces에 대한 참조가 및 Factory (IBusinessBusiness.Interfaces에 대한)

내 공장 프로젝트는 해결 의존성을 위해 Unity을 사용합니다. 이 프로젝트는 구체적인 클래스의 생성자에 액세스하고 클래스와 인터페이스를 매핑하기 위해 MainProject을 제외한 다른 모든 프로젝트에 대한 참조가 있어야합니다. 비주얼 스튜디오 나에게 말한다 때문에

하지만 Factory 프로젝트에 Business에 대한 참조를 추가하지 않습니다

이 사업에 대한 참조가

를 추가 할 수 없습니다입니다. 이 프로젝트를 참조로 추가하면 순환 종속성이 발생합니다.

해결 방법?

+0

저는 Unity에 익숙하지 않지만 관련 프로젝트에 구성 (클래스 등록)이 있어야한다고 생각합니다. 하나의 프로젝트에 모두 포함되는 것은 아닙니다. – KernelMode

답변

1

것은의 응용 프로그램Composition Root에서 모든 종속성을 배선에 대한 책임을 져야한다.

컴포지션 루트는 모듈이 함께 구성되는 응용 프로그램에서 (바람직하게) 고유 한 위치입니다.

또한, 합성 루트 는 외부 라이브러리으로 이동해서는 안된다. 구성 루트를 현대 코드으로 바꾸고 .config 파일로 대체하십시오. 구성 파일 루트를로드하고 종속 어셈블리에 내용을 제공하는 것은 응용 프로그램입니다. 구성 루트에서도 마찬가지입니다.

구성 루트의 작업을 으로 변경하면 종속성을 나머지 응용 프로그램으로 푸시 다운합니다. 종속 어셈블리는 자신의 종속성 인을 가져 오면 안됩니다. 할리우드 원칙 - "전화하지 마세요, 전화 할게"이라고합니다. 즉, DI와 함께 abstract factory pattern을 사용하는 것이 일반적입니다.

어떻게 작동해야하는지 잘 보여주기 위해 this answer을 참조하십시오. 응용 프로그램은 첫 번째 이미지처럼과 같이 보입니다. 두 번째 이미지처럼 만들려고합니다. 응용 프로그램은 논리적으로는 서로 의존하는 별도의 레이어에 설정이지만, 물리적으로는 매우 평평합니다.

+0

매우 포괄적 인 답변 주셔서 감사합니다. 필자는 주 프로젝트에서 구체적인 클래스와 인터페이스 간의 매핑을 설명하는 구성 파일을 사용합니다. 그리고 그것은 다른 프로젝트에 대한 모든 언급을 가지고있는 나의 주요 프로젝트입니다. 'Factory' 프로젝트는 설정에서 단일성 섹션을 읽고'Unity'를 사용하여 의존성을 해결합니다. –

+0

오, 아니, 그건 내가 의미했던 것이 아니다. * 실제로는 설정을'.config' 파일에 넣지 마십시오. 이는 DI를 수행하는 오래된 방법입니다. 실제로 많은 컨테이너가 지원을 중단했습니다. XML 구성은 유형 안전이 아니며 코드에서 컨테이너를 구성하는 것과 비교할 때 매우 취약합니다. 그러나 그 코드를 마치 애플리케이션의'.config' 파일처럼 취급하십시오. – NightOwl888

+0

윙윙클 그래, 이걸 실제로하는 법? 내 주요 프로젝트에는 클래스와 인터페이스 간의 매핑을 사용하는 unityconfiguration.xml 파일이 있습니다. 내 주요 프로젝트에는 다른 프로젝트에 대한 모든 참조 정보가 있습니다. 이것을 변경하는 방법? 내 공장 프로젝트에는 다른 프로젝트에 대한 참조가 없으므로이 프로젝트에서 참조를 추가하고 싶지 않습니다. 이 프로젝트는 구성을 읽고 의존성 만 해결합니다. –

2

한 가지 방법은 프로젝트를 조금 재구성하는 것입니다.

나는 Factory 프로젝트를 완전히 없앨 것이다. 종속성을 해결하는 것이 전부라면, MainProject에서 일을 매핑하는 방법을 알아야하기 때문에 의존성을 해결할 수 있습니다. Business은 비즈니스 로직을 구현하는 것이라면 모든 구체적인 구현을 신경 써서는 안됩니다. 구체적인 클래스가 아닌 추상화 만 사용하십시오.

즉, BusinessInterfaces 프로젝트에만 종속되며, Factory은 사라지고 모든 유니티 매핑은 MainProject에서 수행됩니다. MainProject은 다른 모든 프로젝트를 참조하는 유일한 프로젝트입니다. @Andrei는 지적 DI를 사용하는 응용 프로그램을 구성 할 때

+0

답변 해 주셔서 감사합니다. –