2012-11-07 4 views
0

내가 가지고 일반적인 아키텍처를 가진 MVC 응용 프로그램 ...의존성 주입 - 전달 의존성 끝까지

ASP.NET MVC 컨트롤러 -> 사람 서비스 -> 사람 저장소 -> 엔티티 프레임 워크 DB 컨텍스트

Castle Windsor를 사용하고 있는데 ControllerFactory와 함께이 기능을 사용하면 올바른 종속성을 가진 컨트롤러를 만들 수 있다는 이점을 알 수 있습니다. 이 접근법을 사용하여 Controller는 올바른 Repository를 생성하는 방법을 알고 있으며 올바른 Repository를 사용하는 올바른 DbContext를 알고 있습니다.

윈저의 설정은 ...이 같은 것입니다

dicontainer = new WindsorContainer(); 
dicontainer.Register(Component.For<IPersonService>().ImplementedBy<PersonService>()); 
dicontainer.Register(
    Component.For<IPersonRepository>().UsingFactoryMethod(
     () => new PersonRepository(new HrContext("connectionString")))); 

그것은이 그것을 할 수있는 올바른 방법? UsingFactoryMethod가 마음에 들지 않지만 다른 방법을 생각할 수는 없습니다.

또한 리포지토리에서 서비스 계층에서 필요하지 않은 종속성 (ILogger)이 필요한 경우 어떻게해야합니까? 이것은 ILogger를 서비스 레이어에 전달하고 사용하지 말아야한다는 것을 의미합니까? 이것은 가난한 디자인처럼 보입니다. 나는 여기에 몇 가지 포인터를 주시면 감사하겠습니다. 나는 많은 기사를 읽었지만, 내가이 일을 제대로하고 있는지를 검증하는 구체적인 예를 발견하지 못했다. 감사.

답변

1

나는 공장 방법을 사용하지 않으려 고합니다. 이를 방지하기 위해 새 DbContext를 만드는 데이터베이스 세션 객체를 만들 수 있습니다. 그런 다음 리포지토리는 IDbSession의 인스턴스를 가져 와서 dbContext 속성을 사용해야합니다. 그런 다음 IDbSession 객체의 범위를 쉽게 제어 할 수 있습니다 (스레드가 안전하지 않기 때문에 싱글 톤을 사용하지 마십시오).

더 중요한 점을 만들 수 있도록이 지점을 만들고 싶었습니다 ... 생성자가 DI 컨테이너에 등록 된 개체 만 가져옵니다 (생성자의 옵션 또는 구성 없음). 옵션과 설정은 그 값을 읽거나 쓰는 것만을 목적으로하는 클래스에서 읽기/쓰기되어야합니다. 모든 클래스가이 모델을 따르는 경우 DI 등록이 쉬워지고 클래스는 생성자에서 필요한 모든 종속성을 추가 할 수 있습니다.

생성자에 옵션이있는 제 3 자 라이브러리를 사용하려는 경우 사용하기 쉬운 생성자가있는 클래스에서 해당 클래스를 래핑하고 구성 클래스를 사용하여 제 3 자에게 전달해야하는 값을 읽습니다 도서관. 또한이 디자인은 코드와 타사 라이브러리 간의 추상화 계층을 도입하여 필요할 때 타사 라이브러리를보다 쉽게 ​​스왑 (또는 스터핑)하는 데 사용할 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. DbContext를 래핑 할 클래스를 만드는 방법에 대한 첫 번째 부분을 얻습니다. 두 번째 부분에 대해서는 100 % 확신 할 수 없습니다. 이것은 아마도 당신이 제안하고있는 것입니까? 1. IDbSession에 DbContext를 래핑하고 IDbSession을 리포지토리에 전달합니다. 2. connectionString을 IDbSession에 전달하고 ConfigurationManager를 래핑하여 AppSettings를 가져올 수있는 IConfigurationManager를 전달합니다. 많은 감사. – user644698

+0

1. 정확함 2. 정확한 정렬 ... 이는 ConfigurationManager를 순전히 래핑하는 것만 큼 일반적 일 수 있지만 일반적으로 구성 유형에 따라 다르며 관리자 내부에서 오류 처리를 수행합니다. getter가 .Net ConfigurationManager를 호출하는 ConnectionString 속성을 노출하는 IDbConfigurationManager와 같은 것일뿐만 아니라 구성 파일에 없거나 문자열이 잘못된 경우 예외가 발생합니다. 소비자는 단지 속성을 호출해야하고 하드 코딩 된 "Key"문자열에 대해 알 필요가 없습니다. – TylerOhlsen

+0

팁 주셔서 감사합니다 ... – user644698