2010-01-19 5 views
3

중간 크기 asp.net MVC 앱이 있습니다. 그것은 모든 리포지토리 사용, 도메인 서비스 호출 등을 처리하는 서비스 계층을 소비합니다. 내 컨트롤러 작업은 매우 슬림합니다. 기본적으로 서비스 클래스를 호출하고 응답을 받고이를 표시합니다. 대부분의 구성 요소는 가난한 사람의 DI를 기반으로 한 인터페이스입니다. 앱이 커지고 있고, 더 나은 테스트 지원이 필요하며, IoC 컨테이너를 호출하기 시작했습니다.서비스 계층을 사용할 때 IoC 컨테이너를 구성하는 올바른 계층은 무엇입니까?

내가 읽은 모든 것 (예 : this SO question)은 응용 프로그램 루트에 IoC를 구성해야한다고 나와 있습니다. 내가 컨트롤러 작업에서 바로 리포지토리를 사용하고 컨트롤러 수준에서 DI가 필요한 경우 이는 나에게 의미가 있습니다. 내 서비스 계층에 내 컴포지션 루트가 필요한 것 같습니다. UI 레이어에서 내 web.config (또는 다른 설정)가 리포지토리, 신용 카드 프로세서 등에 대해 언급 /보고/청취하기를 원하지 않는다고 계속 생각합니다.

나는 올바른 방법에 대해 생각하고 있습니까? 아니면 그냥 그걸 극복해야합니까?

답변

1

당신은 그냥 Web.config의에서 DI 컨테이너 물건을 많이해야 할 필요가 없습니다 응용 프로그램 루트에 구성 루트를 갖는

을 :) 극복해야합니다. 원한다면 할 수 있지만 선택 사항입니다. 은 선택 사항이 아니며 응용 프로그램 루트에 Composition Root를 넣을 때 Global.asax에 일부 DI 코드가 있어야합니다.

컨트롤러가 너무 얇기 때문에 관련이 없을 수 있지만 실제로는 그렇지 않습니다.실제 요점은 인 마지막 책임 순간까지 당신 (추상 '너')이 커플 링 클래스를 연기하기를 원한다는 것입니다. 일찍 커플을할수록 유연성이 떨어집니다.

서비스 계층에서 클래스를 연결하면 그 시점에서 되돌릴 수없는 결정을 내릴 수 있습니다. 나중에 이들 서비스를 다르게 작성해야한다는 사실이 밝혀지면 다시 컴파일 할 필요가 없습니다.

큰 이점이 있다면 왜 그렇게하고 싶은지 이해할 수 있지만 그렇지 않습니다. 절대적으로 그렇게해야 할 때까지 모든 구성 요소를 구성 할 수 있습니다. 응용 프로그램의 시작점에 있습니다.

0

Java 관점에서 볼 때, IoC 컨테이너 용 Spring 프레임 워크를 사용한다. 이 컨테이너는 실제로 애플리케이션 전체에 적용됩니다. 서로 다른 레이어 (persistence 설정 파일, 서비스 설정 파일, 컨트롤러 설정 파일 등)마다 다른 설정 파일을 가질 수 있지만 모든 객체 (Java 용어의 bean)는 컨테이너에 저장됩니다.

나는 당신이 언급 한 것처럼 클래스들 사이의 커플 링이 없기 때문에 여전히 괜찮다고 생각합니다. 뷰는 동일한 IoC 컨테이너에 있기 때문에 신용 카드 프로세서에 대해 알 필요가 없습니다. 이러한 클래스는 필요한 종속성 만 (주입에 의해) 수신되며 컨테이너의 다른 객체와는 관련이 없습니다.

1

나는 당신과 같은 상황이며 다음과 같이 다룹니다.

내가 사용하는 일반적인 규칙은 global.asax 또는 비슷한 것을 가지고 있기 때문에 IoC 구성 요소를 등록하는 코드를 실행해야합니다. 퍼팅하는 또 다른 방법은 실행중인 다른 프로세스 (즉, 웹 사이트가 한 프로세스에 있고 서비스가 다른 프로세스에 있음)마다 실행해야한다는 것입니다.

내 경우에는이 작업을 mvc 웹 사이트 global.asax와 서버에 대해 한 번 수행합니다. 이 경우 서비스와 웹 사이트간에 등록이 달라집니다.

나는 또한 한 가지 더합니다. 사실 mvc 앱과 서비스 (즉, 로깅) 사이에서 구성 요소를 재사용하기 때문에 시스템의 핵심 IoC 구성 요소를 등록하는 세 번째 핵심 구성 요소가 있으며이 구성 요소는 웹 사이트 및 서비스 등록 모두에 의해 호출됩니다. 따라서 서비스와 웹 사이트간에 공통점이있는 항목은 핵심 등록으로 이동 한 다음 다른 내용은 '인터페이스'특정 등록으로 이동합니다.

희망이 있습니다.

관련 문제