2011-05-18 39 views
0

使用structuremap和C#4.0中基本上我已經是這樣的:StructureMap在C#創建一個配置對象的WinForms

interface IBoard 
{ 
    void Setup(); 
} 

class Board : IBoard 
{ 
    IConfig _config; 

    Board(IConfig config) 
    { 
     _config = config; 
    } 

    void Setup() 
    { 
     //use the _config object here 
    } 
} 

class Game 
{ 
    IBoard _board; 

    Game(IBoard board) 
    { 
     _board = board; 
    } 
} 

partial class Form1 
{ 
    Form1() 
    { 
     InitializeForm(); 
    } 

    //in here we need to do some work to setup the IConfig object 
    //via form controls 
} 

partial class Form2 
{ 
    Game _game; 

    Form1(Game game) 
    { 
     InitializeForm(); 
     _game = game; 
    } 
} 

現在在正常使用的ID只是說

For<Type>().Use<Class>() 

點左右我所有的依賴關係。然而我所後是什麼,是用來設置在Form1的配置對象的值,然後調用窗口2,在存儲器中設置和整個應用程序維護的配置值的最佳模式?我想用一個單獨但是單應該是imuttable,或者至少靜態創建,而不是接受一個基於參數配置的......所以做什麼?我目前建立在WinForm的方案在Form1通過

ObjectFactory.Get<Form1>(); 

回答

3

我不認爲IConfig是一個非常適合使用的容器,因爲你不知道的參數值,直到它的時間來實例化它創建。我認爲你必須配置實例供給,爲了獲取調用的形式容器中的代碼。

您可以使用With方法提供參數的容器:在你的應用程序

ObjectFactory.With<IConfig>(theConfig).GetInstance<Form2>(); 

你要儘量減少容器調用,最好只有一個地方,在引導線了它的其餘部分。另一種方法是註冊一個函數功能,解決引導過程中,並用它來創建窗體2的實例。

報名:

var formFactory = config => new Form2(config); 
x.For<Func<IConfig, Form2>>().Use(() => formFactory); 

用法:

//Get the Func somehow, preferably as a ctor dependency in Form1 
var form2Creator = ... 
var config = new Config({some parameters from Form1 here}); 
var form2 = form2Creator(config); 
+0

聽起來不錯,這幾乎是我一直在尋找...不適當給它一個旋轉和回發 – AaronHS 2011-05-19 07:06:14

+0

ive編輯你的答案適合一點,但問題仍然是,遊戲對象需要通過form1 ctor (我認爲這是不必要的 - 請告訴我你的想法),並且具有IConfig對象的Game對象拋出異常,因爲它沒有被SM正確創建(當我刪除它時,一切正常) – AaronHS 2011-05-19 11:32:37

+0

@AaronHS:也許編輯問題而不是答案? – Andomar 2011-05-19 11:35:13

0

啓動如果寄存器Config這樣的:

For(Of IConfig).Singleton.Use(Of Config) 

這將是StructureMap會照顧其餘的。

另一種方法是:

開始單位工作,並設置你的價值觀,做你的工作,並部署UOW,但它是一個小複雜,我不知道,如果你需要UOW或不。

+1

與方法的問題,如果我理解正確的OP,是該配置僅基於在創建時已知參數創建(不類型被註冊的時間)。 – PHeiberg 2011-05-18 16:31:57

+0

它創造了它是從ObjectFactory的請求的第一次。順便說一句,當你的類型被註冊時,你真的需要創建它嗎?如果是這樣,留下評論,我會更新我的帖子。 – 2011-05-18 16:40:36

+1

爲了創建配置,您需要一些數據,直到用戶將其輸入Form1(這是註冊發生之後)纔可用。這是我對OP問題的看法。 – PHeiberg 2011-05-18 17:31:27