2016-06-30 6 views
1

DI를 관리하는 DI 및 DI 컨테이너에 대해 조금 읽었습니다.DI 컨테이너 및 구체적인 값/구성 데이터

기본적으로 의존성이있는 클래스를 만들고 생성자 또는 설정 메소드를 사용하여 주입 할 수있는 방법을 제공합니다. 그런 다음 DI 컨테이너에 모든 것을 연결하는 데 사용할 구체적인 클래스를 알려줍니다. 마지막으로 서비스 로케이터 (service locator)를 호출합니다.이 서비스 로케이터는 모든 의존성을 해결하고 단 한 줄의 코드만으로 복잡한 객체를 제공합니다.

나는 구체적인 DI 컨테이너 구현을 한 번도 사용하지 않았기 때문에 DI 컨테이너가 어떻게 가장 낮은 레벨의 객체를 처리하는지 궁금합니다. 이러한 객체는 대부분 구체적인 (코딩 된) 값 또는 구성 파일의 내용을 사용하여 구성해야합니다. 예를 들어이 걸릴 :

class FooDao { 
    public FooDao(DBConnection db) {...} 
} 

class ConcreteDBConnection : DBConnection { 
    public ConcreteDBConnection(String url, int port, String user, String pw) 
    {...} 
} 

당신은 당신이 ConcreteDBConnection 객체로 FooDao의 객체를 생성 할 것인지, (주석, XML 파일, 또는 뭔가 다른 사용) DI 컨테이너를 말할 것. 그러나 DI 컨테이너에 데이터베이스 연결에 필요한 구체적인 값을 어떻게 설명합니까? 구체적인 값을 먼저 계산해야하는 경우 (예 : 로컬에 저장된 데이터베이스 연결 정보를 암호화하는 경우)

나는 이것이 매우 일반적인 질문이지만, DI 컨테이너에 관해 읽은 기사 또한 매우 일반적이었고이 점이 나를 혼란스럽게 만들었다. 어떤 인기있는 DI 프레임 워크가 이것을 어떻게하는지에 대한 간단한 설명은 나의 질문에 답하기에 충분할 것입니다.

+2

[의존성 주입 방지 패턴 : 구성 요소에 런타임 데이터 주입] (https://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=99&month=11&year=2015) 및 [왜 우리는 추상적 인 공장 디자인 패턴이 필요합니까?] (http://stackoverflow.com/q/2280170/181087) – NightOwl888

답변

1

인기있는 DI 컨테이너를 사용하는 방법을 묻는다면 Castle Windsor 사용에 관한 기사가 많이 있습니다 (예 : http://ardalis.com/getting-started-with-castle-windsor). 다른 DI 프레임 워크를 사용해 보면 익숙 할 것입니다. 캐슬 윈저 (Castle Windsor)는 정말로 훌륭합니다. 시작하기에 좋은 장소입니다.

당신이 DI 컨테이너 작업 방법을 요구하는 경우 - 즉 더 이상 토론, 그러나 기본은이 : 1. 당신은 당신의 프레임 워크를 사용하여, 어떤 종류의 컨테이너를 만듭니다. 일반적으로 간단합니다. var container = new Container(); 1. 인터페이스 ("서비스")의 매핑을 컨테이너의 구체적인 클래스에 등록합니다. 어떤 프레임 워크는 가장 공통적 인 요구 사항처럼 IFoo와 하나의 해상도, Foo 클래스가 있으면 자동으로 등록 될 수 있습니다 (iirc, Autofac는 이것을합니까?) 2. 컨테이너에 인터페이스를 확인하도록 요청합니다. 인터페이스는 다시 클래스로 매핑됩니다. 해결 중에, 컨테이너는 제공된 concrete 클래스의 생성자를 조사하고 유형에 따라 매개 변수를 분석하려고 시도 할 수 있습니다. 비슷하게 유형 및 알려진 등록을 기반으로 등록 정보를 설정할 수 있습니다.

+0

구체적인 값을 주입하는 방법을 묻습니다. 인터페이스에 대한 구체적인 클래스를 등록하는 것은 꽤나 간단합니다.하지만 Di 컨테이너에 대한 모든 기사에서 의존성이없는 "리프 클래스"로 끝납니다. 개체 계층 전체에 주입해야하는 많은 구성 데이터가 있으므로 약간 이상하다고 생각했습니다. –

+1

많은 곳에서 주입 할 설정 데이터가 있다면, 우리는 일반적으로 생성자를 통해 주입 될 수있는'IApplicationConfig'와 같은 인터페이스를 가질 것입니다. 구체적인 구현은 수동으로 등록 할 수 있습니다 (예 : Windsor가 싱글 톤 등록을 수행 할 수 있음). 또는 DictionaryAdapter로 트릭을 실행하여 app.config에서 구성을 가져올 수 있습니다. – daf

+0

등록은 일시적 일 필요는 없습니다. 스레드, http 요청 또는 응용 프로그램 수명에 따라 수명주기가 달라질 수 있습니다. – daf

관련 문제