2011-06-06 42 views
0

我想我的構造函數使用參數調用另一個構造函數,但是當我這樣做(MyProperty)時,MyProperty必須是靜態的。問題是在這個靜態屬性的getter中,我必須從structuremap Container中獲取ISettingReader的一個實例,並且因爲它是靜態的,所以我的容器只包含兩個元素而不是超過50個元素,然後它找不到實例。 (ISettingReader上的pluginFamily錯誤)構造函數鏈和靜態屬性參數和結構映射

這是我的代碼。

private static Func<LinqDataContext> _contextFactory; 
    public static Func<LinqDataContext> DefaultContextFactory 
    { 
     get 
     { 
      var settingReader = ObjectFactory.GetInstance<ISettingReader>(); // I get an error saying it can't find ISettingReader() 
      var connectionString = settingReader.GetSetting("MyProject.ConnectionString"); 
      _contextFactory =() => new LinqDataContext(connectionString); 
      return _contextFactory; 
     } 
    } 

    public MyProjectViewModelService() : this(DefaultContextFactory) 
    { 

    } 

    public MyProjectViewModelService(Func<LinqDataContext> contextFactory) 
    { 
     _contextFactory = contextFactory; 
    } 

我想如果我能擺脫我的靜態關鍵字,它應該工作。我確認我在ProgramMap容器​​中初始化了我的ISettingReader,當我在Program.exe中啓動我的應用程序時

那麼我該怎麼做? 謝謝!

約翰

PS:有類似的問題,我的計算器發現,但他不使用structureMap: Constructor chaining with intermediate variables

回答

1

你爲什麼不從你的getter移動代碼添加到默認的構造函數,並把ISettingReader作爲構造函數中的依賴項。當您請求新的MyProjectViewModelService時,Structuremap將自動解析ISettingReader併爲該依賴項提供實例化的默認類型。

所以,如果你將有
public MyProjectViewModelService(ISettingReader settingReader)
{
var connectionString = settingReader.GetSetting("MyProject.ConnectionString");
_contextFactory =() => new LinqDataContext(connectionString);
}

您可以刪除休息。

從結構圖獲得的異常是因爲您沒有爲ISettingReader配置任何默認實例

+0

您是絕對正確的。我以爲我知道結構圖很好,但實際上不是-_-。但是,無論如何感謝你,你是C#開發的神。 – Gui 2011-06-06 11:13:17