StructureMap 2.5注册表语法

时间:2010-09-24 14:49:33

标签: c# structuremap

我正在尝试在将请求的类型注入到多个类中时配置备用构造函数参数。在以前的StructureMap版本中,它看起来很像第一个DSL example on the document page,但我无法弄清楚如何使用新语法配置它。

我现在得到的是一个具有一个具体实现的接口,但是我需要构造函数参数根据它被注入的对象进行更改。例如:

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 个答案:

答案 0 :(得分: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添加一个条目。