2010-02-15 6 views
4

저는 IoC 초보자입니다. 그래서 내가하고 싶은 직업에 적합한 도구인지 궁금합니다.IoC 컨테이너를 사용하여 런타임 값이 필요한 종속성을 만들 수 있습니까?

저는 멀티 테넌트 응용 프로그램을 작성 중이며 현재 로그온 한 사용자가 속한 조직을 기반으로 다양한 인터페이스 구현을 사용할 수도 있습니다.

예를 들어 한 조직의 사용자가 작업 주문을 작성하면 해당 사용자의 감독자에게 전자 메일을 보내야한다고 가정 해 보겠습니다. 그러나 다른 모든 조직에서는 해당 전자 메일을 보낼 필요가 없습니다. 고전적인 전략 패턴 종류의 것.

내 질문은 어떻게 든 특정 런타임 값 (이 경우 로그온 한 사용자의 OrganizationId)을 확인하도록 IOC 컨테이너에 지시하여 IWorkOrderProcessor의 구현을 확인하여 해당 객체의 생성자에 삽입 할 수 있습니까? 그것을 필요로합니까?

현재 Windsor를 사용하고 있지만 다른 컨테이너를 사용하는 것이 좋습니다.

답변

3

윈저는 멀티 테넌트 (multi-tenant) 애플리케이션을위한 완벽한 적합 확장 점을 가지고 IHandlerSelector.http://ayende.com/Blog/archive/2008/10/05/windsor-ihandlerselector.aspx 이는 멀티 테넌트 (multi-tenant)하지 것처럼 응용 프로그램을 코딩 할 수 있습니다

  • http://mikehadlow.blogspot.com/2008/11/multi-tenancy-part-2-components-and.html
    • . 다중 소유 로직은 비즈니스 로직의으로 으로 이동합니다.

    +0

    고마워요, 마우리시오! IHandlerSelector 기능은 내가 찾고있는 기능입니다. –

    1

    가장 좋은 IOC 컨테이너가 이러한 종류의 사용을 지원합니다.

    나는 윈저에 익숙하지 않다. 선택의 IOC는 StructureMap이다. StructureMap 유창한 인터페이스에는 코드에서 표현할 수있는 거의 모든 것에 따라 객체의 런타임 주입 매개 변수 설정을위한 많은 옵션이 있습니다. 윈저가 똑같은 제안을 할거야.

    내가 IOC를 사용하는 것과 관련하여 말할 수있는 유일한 점은 언젠가 실제로 솔루션을 이해하기가 더 어렵다는 것입니다.

    예를 들어, IOC를 주입 된 전략 객체 (일부 팩토리 접근법 사용)로 사용하지 않아도이 동작을 구현할 전략 패턴의 실제 사용 사례가 실제로있는 경우 그렇습니다. IOC 구현을 계속 진행하십시오.

    그러나 특정 사용자가 전자 메일을 받았는지 여부를 나타내는 논리를 표현하기 위해 전체 개체 추상화를 주입 할 필요가 없다면 패턴을위한 패턴의 경우 일 수 있습니다. IoC 컨테이너 사출의 다른 유형 사용할 수 있기 때문에

    0

    나는, 당신이 할 수있는 생각 :

    1. 생성자 주입,
    2. 세터 주입,
    3. 인터페이스 주입 (방법 주입)

    생성자 주입은 완전히 초기화 된 객체를 제공하지만 주입하려는 유형 및 값은 객체가 생성되기 직전에 알려야합니다 (예 : 구성 f ile).

    주입 (또는 세터) 주입은 유동적입니다. - 원하는 유형 또는 값이 될 때까지 주입을 지연시킬 수 있습니다. 이 접근법의 단점은 당신이 그것을 만들 때 완전히 초기화 된 객체가 없다는 것입니다.

    모든 것은 컨테이너가 구현되는 방식에 따라 다릅니다. 그런데

    은 : 비슷한 질문은 질문을 받았다 : IoC: Existing runtime objects rather than container-initialised prerequisites for components

    +0

    * "유형과 당신은 응용 프로그램의 시작 (예를 들어, 구성 파일에서로드)에 알려지게 한 주입되는 값"* -> 제 –

    +0

    그래, 내 말은 그들은 객체 생성 직전에 알려 져야합니다. 내 실수. 결정된. 고맙습니다. –

    0

    이것은 DI와 관련된 일반적인 문제이며, 대답은 항상 추상 팩터 리을 만들고 삽입하는 것입니다. 귀하의 경우,이 같은 인터페이스를 정의 할 수 있습니다 :

    public interface IWorkerProcessorFactory 
    { 
        IWorkerProcessor Create(int organizationId); 
    } 
    

    당신이 조직의 ID를 가지고 IWorkerProcessor의 인스턴스를 필요로하는 모든 클래스에서를, 당신은 IWorkerProcessorFactory에 대한 종속성을하고 Create 메서드를 호출합니다.

    이 패턴은 불쌍한 남자의 DI 또는 사용하고자하는 DI 컨테이너와 동일하게 작동합니다. 여기

    은보다 완벽한 예제 : Can't combine Factory/DI

    관련 문제