2011-07-28 3 views
4

Windows 응용 프로그램 프로젝트에서 StructureMap을 사용하기 시작했습니다. 기본 학습에 대한 작업에서 동일한 목표를 달성하는 내 솔루션을 마련하는 2 가지 방법을 찾았습니다.이 2 가지 옵션 중 하나가 더 나은 옵션으로 보이고 그 이유가 누구인지에 대해 의견을 말할 수 있는지 궁금합니다.StructureMap을 사용하여 다른 프로젝트 조직보다 우수한 프로젝트 조직 중 하나입니까?

여기서 목표는 IOC를 사용하여 두 서비스를 종속성없이 사용하는 것이 었습니다. 그래서 비즈니스 계층에 인터페이스를 만든 다음 인프라 프로젝트에서 이러한 인터페이스를 구현하고 그 시점에서 실제 서비스를 래핑했습니다.

내 첫 번째 시도에서 유창한 인터페이스 (누군가가 IServiceA를 원할 때 ServiceX의 인스턴스를 제공)를 사용하여 구조 맵을 초기화하는 코드가있는 DependencyResolver 프로젝트를 만들었습니다. DependencyResolver의 초기화가 내 응용 프로그램에서 쫓겨 될 필요가 있기 때문에, 나는 응용 프로그램에서 참조는 다음과 같이 DependencyResolver해야 :

First attempt. Strongly typed StructureMap initialization. App has indirect references to everything because of it's reference to DependencyResolver

을 그럼 내가 DependencyResolver 내 참조를 제거하고 의존 할 수 있다는 것을 발견 StructureMap 스캐너 및 런타임에 해당 참조를 얻기 위해 명명 규칙에 그럼 내 설정은 다음과 같습니다

App now uses StructureMap directly to instantiate the class in DependencyResolver at runtime, and from there DependencyResolver sets up the remaining stuff just like in the earlier version.

을 그럼, 내가 사용하던 서비스로 아래로, 더 명명 규칙을했다이었다 할 수있어 DependencyResolver를 함께 사용하면됩니다. 이 시점에서, 나는 완전히 structuremap 스캐너와 명명 규칙에 의존하고 올바르게 가지 설정을 얻을 수 있습니다 :

enter image description here

겠어요 - 여기에 나는이 3 가지 옵션에 대해 어떻게 생각해야하는지 잘 모릅니다. 옵션 1은 좋은 것으로 보이지만, UI를 사용하여 간접적으로 참조해야하는 모든 사항을 StructureMap을 사용하여 간접적으로 참조했습니다. 그러나이 이 실제로 일지는 확실하지 않습니다.

옵션 2는 DependencyResolver에 대한 참조 필요성을 제거하고 해당 프로젝트의 클래스에 액세스하기 위해 이름 지정 규칙을 사용하며 나머지 설정은 여전히 ​​제어 할 수 있습니다 (단, 내 응용 프로그램에서 직접 structureMap에 대한 의존성).

옵션 3이 가장 쉽고 (모든 이름을 특정 방식으로 지정하고 어셈블리를 스캔하는 것), 그러나 또한 오류가 발생하기 쉽고 부서지기 쉬운 것처럼 보입니다. 특히 IServiceAbc => ServiceAbc보다 좀 더 복잡한 것을하고 싶다면.

그럼,이 기사를 많이 읽은 경험이있는 분이라면 조언을 해줄 수 있습니까?
내 앱에서 내 서비스로의 간접 참조를 피하고 있어야하며, 그렇다면 실제 이점은 무엇입니까? 명명 규칙을 사용하여 모든 작업을 수행하는 것이 단순한 프로젝트에서만 현명한 방법일까요?
내가 여기에서하려고하는 것을 수행하기위한 표준 패턴이 있습니까? 긴 게시물에 대한 죄송합니다

..

답변

4

Composition Root에있는 StructureMap의 모든 사용을 캡슐화하고 나머지 코드 기반에서 생성자 삽입을 사용하십시오.

원한다면 별도의 어셈블리에 Composition Root를 구현할 수 있지만 일반적으로 직접 실행 파일 자체에 배치 한 다음 모든 응용 프로그램 논리를 별도의 라이브러리에 구현하는 것이 좋습니다.

+0

응용 프로그램 자체에 넣으면 내 응용 프로그램은 해당 어셈블리를 설정하기 위해 해당 어셈블리에 액세스하는 데 사용 된 모든 코드가 인터페이스를 통해 수행 된 경우에도 프로젝트의 모든 어셈블리를 직접 참조해야합니다. 컨테이너. 이상하지 않은가 보지 않습니까? 아마도 별 문제가 아니지만 앱 및 도메인/비즈니스 계층에 제 3 자 서비스에 대한 언급이없는 것이 더 조직적으로 보입니다. – chrismay

+1

그런 이유로 도메인 모델을 별도의 어셈블리에 넣으려고합니다. –

+1

이 아키텍처 분리에는 더 정교함이 필요합니다. –

1

나는 프로젝트의 상단 디자인을 사용하고 그것은 매우 잘 작동합니다.

의존성 해결자는 인터페이스 인스턴스를 반환하는 공장이 더 많거나 적습니다. 구현하기위한 구조지도가 아닌 것입니까?이 경우 하나의 중앙 위치에서 의존성 분석자를 통해 항목을 요청할 것입니다. 그런 다음 구조지도를 제거하고 앱에 대한 다른 정보를 변경하지 않고 다른 서비스 위치 지정자 (단일성, 성 윈저 등)를 추가 할 수도 있습니다.

세 번째 옵션의 UI 프로젝트 (UI 프로젝트를 스왑하고 다른 프로젝트를 바꾸면 어떻게됩니까?)뿐 아니라 두 번째 옵션에서 볼 수있는 두 위치에서 종속성을 해결해야합니다.

관련 문제