2013-03-13 2 views
0

나는 종종 의존성을로드해야하는 일부 클래스를 사용해야합니다. 그러나 내 구성 요소는 둘 이상의 구체적인 종속성 구현을 가질 수 있으며 일부 개체 매개 변수를 기반으로 하나를 선택합니다.사용자 매개 변수로 종속성 해결

실제 문제는 응용 프로그램이 시작될 때 개체 매개 변수가 항상 알려지지 않아서이 순간에 종속성을 등록하거나 해결할 수 없다는 것입니다.

interface ISample { } 

class ParamForBuildSomeISampleImplementation 
{ 
    // this instance cannot be create by my startUpApplication - Container - Resolver. 
    // Instead, all time dependency is required (buttonClick, pageLoad and so on), this class can be instantiated. 
} 

class Sample1 : ISample 
{ 
    // some implementation 
} 

class Sample2 : ISample 
{ 
    // some other implementation 
} 

class MyISampleFactory 
{ 
    // Build ISample 
    public ISample Build(ParamForBuilderISample obj) 
    { 
     // if obj.someProperty == ".." return new Sample1(); 
     // else if obj.someProperty == "--" return new Sample2(); 
     // else if ... 
    } 
} 

class NeedsDependency 
{ 
    ISample _someSample; 
    public NeedsDependency(ISample someSample) 
    { 
     _someSample = someSample; 
    } 
} 


// *** Controllor - ApplicationStartup - other *** 
// Here I have not idea how to build ISample dependency 

@@ EDIT 
// *** button click event handler *** 
// Ok, here I know how to create ParamForBuilderISample, 
// hence I can call MyISampleFactory, then, I can Use NeedDependency class: 
ParamForBuilderISample obj = new ... 
obj.SomeProperty = ... 
obj.otherSomeProperty = ... 
ISample sample = MyISampleFactory.Build(obj); 
NeedDependency nd = new NeedDependency(sample); 
// perfect, now my buttonClick can execute all what it wants 
nd.DoSomething(); 
nd.DoOtherStuff(); 

내 시나리오 :

대신에, 예를 들면, 나는 자체가 내가 위해 concreteBuilder에 의해 사용되는 오브젝트 매개 변수를 알고 의존 관계 (dependencies)를로드 할 필요가 몇 가지 클래스를 사용할 필요가있을 때 나에게 적절한 구현을 반환 종속성 주입 패턴에 적합합니까? 사실이라면 내 패턴을 구축하는 방법을 알지 못합니다.

답변

0

이 '런타임 종속성'을 전달하기 위해 생성자 삽입을 사용하는 대신 메소드 삽입을 사용하는 것이 더 나을 것입니다. 이것은 심지어 완전히 공장을 가지고에 대한 필요성을 제거 할 수 있습니다 당신은 여전히 ​​어딘가에 전환, 대신에 공장이있는의 필요

private readonly ISample sample; 

public MyController(ISample sample) { 
    this.sample = sample; 
} 

public string button_click_event_handler(object s, EventArgs e) { 
    ParamForBuilderISample obj = new ... 
    obj.SomeProperty = ... 
    obj.otherSomeProperty = ... 

    this.sample.DoSomething(obj); 
} 

을, 당신은 ISample에 프록시를 구현할 수 :

public class SampleProxy : ISample 
{ 
    private readonly Sample1 sample1; 
    private readonly Sample2 sample2; 

    public SampleProxy(Sample1 sample1, Sample2 sample2) { 
     this.sample1 = sample1; 
     this.sample2 = sample2; 
    } 

    public void DoSomething(ParamForBuilderISample param) { 
     this.GetSampleFor(param).DoSomething(param); 
    } 

    private ISample GetSampleFor(ParamForBuilderISample param) { 
     // if obj.someProperty == ".." return this.sample1; 
     // else if obj.someProperty == "--" return this.sample2; 
     // else if ... 
    } 
} 

귀하의 ParamForBuilderISampleparameter object처럼 보입니다. 의존성 삽입으로 메소드 인수가 필요하지 않습니다. 데이터는 여전히 메소드를 통해 전달되어야합니다.

+0

본인의 예를 이해하지 못합니다. 나는 코드 숨김에서만 ParamForBuilderISample 인스턴스를 만드는 방법을 알고있다. 액션 메소드 (이게 뭐야?)를 사용했지만 액션 메소드는 아무것도 알 수 없습니다. 마지막으로, 당신은 말했다 : "의존성 주입은 메소드 인수를 가질 필요성을 제거하지 못한다."그러나 나는 아직도 그것을 어떻게하는지 모른다. – bit

+0

내 문제의 명확한 설명을 위해 내 게시물의 코드 스 니펫을 편집했습니다. @@ Edit word를 참조하십시오. – bit