2013-03-13 60 views
0

我經常需要使用一些本身必須加載一些依賴才能工作的類。 但是,我的組件可以有多個具體的依賴關係實現,它將在某個對象參數的基礎上選擇一個,而不是另一個。解決用戶參數的依賴

真正的問題是,應用程序啓動時對象參數始終是未知的,所以我無法在此刻註冊任何依賴項,也無法解決它們。

相反,例如,當我需要使用一些類本身也需要加載一些依賴我知道爲了使用concreteBuilder對象參數返回我合適的實現:

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(); 

是我的情景適合依賴注入模式?如果屬實,我真的不知道如何建立我的模式。

回答

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 ... 
    } 
} 

ParamForBuilderISample看起來像一個parameter object。依賴注入不會消除對方法參數的需要。數據仍應通過方法傳遞。

+0

我不明白你的例子。我知道如何僅在代碼隱藏中使ParamForBuilderISample實例。你已經使用了一個Action方法(這是什麼?),但是Action方法不知道任何東西。最後,你說:「依賴注入並沒有消除需要有方法論證」,但我仍然不知道它是如何做到的。 – bit 2013-03-13 13:48:54

+0

我編輯了我的文章的代碼片段,以更好地闡明我的問題..請參閱@@編輯詞。 – bit 2013-03-13 19:05:02