C# StructureMap:如何设置接口的特定具体实例以使用特定的CTOR

C# StructureMap:如何设置接口的特定具体实例以使用特定的CTOR,c#,structuremap,C#,Structuremap,相应的注册表设置为 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){} } 该项目的注册情况如下 public interface IBar{} public class Bar1

相应的注册表设置为

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){}
}
该项目的注册情况如下

public interface IBar{}
public class Bar1:IBar {
  public Bar1(IFoo foo){}
}

public class Bar2:IBar {
  public Bar2(IFoo foo){}
}
ForRequestedType().TheDefault.Is.OfConcreteType().CtorDependency().Is();
现在我想让Bar2使用Foo2,我想让Foo2使用我尝试过的构造函数“new Foo2(1)”

ForRequestedType<IBar>().TheDefault.Is.OfConcreteType<Bar1>().CtorDependency<IFoo>().Is<Foo1>();
InstanceOf().Is.ConstructedBy(()=>newfoo2(1));
但这失败了。
如果有的话,我如何使用StructureMap注册表使其工作?

您可以在注册表中执行此操作:

InstanceOf<Foo2>().Is.ConstructedBy(()=> new Foo2(1));
For()。使用(()=>newfoo2(1))。命名为(“BarFoo”);
For()。使用(()=>newfoo1(“somestringval”);
For().Use().Ctor().Named(“BarFoo”);
我测试结果如下:

For<IFoo>().Use(() => new Foo2(1)).Named("BarFoo");
For<IFoo>().Use(() => new Foo1("some string val"));

For<IBar>().Use<Bar1>().Ctor<IFoo>().Named("BarFoo");
//这将是一个用字符串参数构造的Foo1实例
var foo=container.GetInstance();
//这将是一个Bar1,包含一个Foo2实例,使用int-ctor参数构造
var bar=container.GetInstance();
配置行的小说明:

  • 第1行-绑定到Foo2(int)的IFoo注册-名为“BarFoo”
  • 第2行-绑定到Foo1的IFoo注册(字符串)-这将是IFoo的默认值,因为它是最后定义的
  • 第3行-绑定到Bar1的IBar注册,告诉它使用名为“BarFoo”的绑定来解决IFoo依赖关系
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>();