2010-09-24 86 views
3

我想配置替代構造函數參數,當一個請求的類型被注入到幾個類中時。在以前的StructureMap版本中,它看起來很像第一個DSL example on the document page,但我很難弄清楚如何使用新語法來配置它。StructureMap 2.5註冊表語法

我現在得到的是一個具有一個具體實現的接口,但我需要構造函數參數根據它被注入的對象進行更改。例如:

interface IInterface{} 
class Concrete : IInterface 
{ 
    public Concrete(string param) {} 
} 
class ConsumerOne 
{ 
    public ConsumerOne(IInterface i) {} // Concrete(param) to be "One" 
} 
class ConsumerTwo 
{ 
    public ConsumerTwo(IInterface i) {} // Concrete(param) to be "Two" 
} 

class MyRegistry : Registry 
{ 
    public MyRegistry() 
    { 
    For<IInterface>() 
     .Use<Concrete> 
     .Ctor<string>("param") 
     .Is(/* "One" if being injected into ConsumerOne, 
      "Two" if being injected into ConsumerTwo */); 
    } 
} 

我想我也許可以用.AddInstance(x => {})爲此,For<IInterface>()後,但我有麻煩發現如何做到這一點。任何幫助或建議,將不勝感激!

回答

1

使用命名的實例,你可以做到這一點,像這樣:

For<IInterface>().Use<Concrete>().Named("1") 
    .Ctor<string>("param").Is("One"); 
For<IInterface>().Use<Concrete>().Named("2") 
    .Ctor<string>("param").Is("Two"); 

For<ConsumerOne>().Use<ConsumerOne>() 
    .Ctor<IInterface>().Is(x => x.GetInstance<IInterface>("1")); 
For<ConsumerTwo>().Use<ConsumerTwo>() 
    .Ctor<IInterface>().Is(x => x.GetInstance<IInterface>("2")); 

一個潛在的缺點,這是你需要添加爲每個新類型ConsumerX,你添加一個條目。

+0

您應該使用添加而不是用於IInterface註冊,因爲它不是您正在註冊的默認設置。通過制定一項公約可以解決潛在的缺點。 – PHeiberg 2010-09-28 11:18:12