StructureMap:如何设置特定具体实现的接口以使用特定构造函数

4
public interface IFoo{}
public class Foo1 : IFoo {
  public Foo1(int id){}
  public Foo1(string val){}
}

public class Foo2 : IFoo {
  public Foo2(int id){}
  public Foo2(string val){}
}

相应的注册表设置如下...
ForRequestedType<IFoo>().TheDefault.Is.ConstructedBy(()=>new Foo1("some string val"));
InstanceOf<IFoo>().Is.OfConcreteType<Foo2>();

我们随后将IFoo用作其他东西的参数...例如:
public interface IBar{}
public class Bar1:IBar {
  public Bar1(IFoo foo){}
}

public class Bar2:IBar {
  public Bar2(IFoo foo){}
}

注册步骤如下:...
ForRequestedType<IBar>().TheDefault.Is.OfConcreteType<Bar1>().CtorDependency<IFoo>().Is<Foo1>();

现在我想让Bar2使用Foo2,并且我希望Foo2使用构造函数"new Foo2(1)"。我已经尝试过:

InstanceOf<Foo2>().Is.ConstructedBy(()=> new Foo2(1));

但这种方法失败了。如何使用StructureMap注册表使其正常工作(如果有可能)?

1个回答

2
您可以在注册表中完成此操作:
For<IFoo>().Use(() => new Foo2(1)).Named("BarFoo");
For<IFoo>().Use(() => new Foo1("some string val"));

For<IBar>().Use<Bar1>().Ctor<IFoo>().Named("BarFoo");

我是这样测试结果的:

// this will be a Foo1 instance constructed with a string ctor parameter
var foo = container.GetInstance<IFoo>(); 

// this will be a Bar1, containing an instance of Foo2, constructed with the int ctor parameter
var bar = container.GetInstance<IBar>();

配置行的简要说明:

  • 第一行 - 绑定到Foo2(int)的IFoo注册 - 名称为“BarFoo”
  • 第二行 - 绑定到Foo1(string)的IFoo注册 - 这将是IFoo的默认值,因为它是最后定义的
  • 第三行 - 绑定到Bar1的IBar注册,告诉它使用名为“BarFoo”的绑定来解决IFoo依赖关系

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接