2012-07-05 31 views
0

以下是需要創建對象的順序。我想初始化整個事情的SM,並且只使用最後一個作爲目標:StructureMap和鏈接參數類?

var firstObject = new FirstClass("First", "Last"); 
var servers = new List<FirstClass> { firstObject }; 
var secondObject = new SecondClass(); 
secondObject.Servers = servers; 
var thirdObject = new ThirdClass(secondObject); 
var fourthObject = thirdObject.SomeGetFunction(thirdObject); 

畢竟這在SM配置,我想基本上只使用

var objectToUse = ObjectFactory.GetInstance<fourthObject>(); 

到目前爲止,我只能走到一半,但無法弄清楚整個配置有多完整。前三個對象是單例,它們只需要正確實例化和配置第四個對象。

回答

0

這是如何完成的。我不確定這是否符合最佳實踐,但能夠完成工作。

要創建的第一個對象需要配置文件中的一些設置;這很容易。

For<FirstClass>() 
    .Singleton() 
    .Use<FirstClass>() 
    .Ctor<string>("First").EqualToAppSetting("FirstKey") 
    .Ctor<string>("Last").EqualToAppSetting("LastKey"); 

第二個是更成問題,因爲在創建後需要兩個屬性進行設置,其中之一是IEnumerable<FirstClass>型的,這是我無法弄清楚如何設置。事實證明,SM的「背景」對象和攔截是答案。

For<SecondClass>() 
    .Singleton() 
    .Use<SecondClass>() 
    .OnCreationForAll((context,x) => 
          { 
           var server = new FirstClass[1]; 
           server[0] = context.GetInstance<FirstClass>(); 
           x.Servers = server; 
           x.Connections = 1; 
          }); 

第三個又簡單了,我們可以讓SM找出依賴關係。

For<ThirdClass>().Singleton().Use<ThirdClass>(); 

而第四個也是最後一個再次棘手,因爲我之後的對象應該是通過調用ThirdClass創建的。再次,在這裏建立「背景」證明是有用的。

For<FourthClass>() 
     .Singleton() 
     .Use(context => context.GetInstance<ThirdClass>().SomeGetFunction("stringParam")); 

現在我所要做的就是致電ObjectFactory.GetInstance<FourthClass>並從那裏進行操作。