C# StructureMap-根据具体请求实例化接口x实例的属性

C# StructureMap-根据具体请求实例化接口x实例的属性,c#,structuremap,ioc-container,C#,Structuremap,Ioc Container,在生成接口IDummy的实例时,如何连接structuremap以注入属性 假设我有一个名为Dummy的具体类,它实现接口IDummy 伪类有两个属性,第一个名为DataContext的属性实现IDataContext,第二个属性只是一个名为MyDummyString的基本字符串 然后,第二个名为DummyConcrete2的IDummy实现只有一个属性MyDummyString(如上所述) 我如何在结构图中连接它,所以当我请求具体的Dummycontrace2时,默认情况下会注入属性。谷歌搜索

在生成接口IDummy的实例时,如何连接structuremap以注入属性

假设我有一个名为Dummy的具体类,它实现接口IDummy

伪类有两个属性,第一个名为DataContext的属性实现IDataContext,第二个属性只是一个名为MyDummyString的基本字符串

然后,第二个名为DummyConcrete2的IDummy实现只有一个属性MyDummyString(如上所述)

我如何在结构图中连接它,所以当我请求具体的Dummycontrace2时,默认情况下会注入属性。谷歌搜索了很多,但还没找到答案。StructureMap文档似乎有一些旧版本(许多不推荐的方法)

任何能对这一点有所启发的评论都是非常好的


谢谢

正如马克在评论中提到的那样,你通常不会直接依赖具体的对象。但您可以配置StructureMap构造具体对象的方式。下面是一个使用最新配置DSL的示例

public interface IFoo { }
public class Foo : IFoo { }
public class Foo2 : IFoo { }
public interface IDummy
{
    IFoo Foo { get; set; }
}
public class Dummy : IDummy
{
    public IFoo Foo { get; set; }
}
public class Dummy2 : IDummy
{
    public IFoo Foo { get; set; }
}

[TestFixture]
public class configuring_concrete_types
{
    [Test]
    public void should_use_configured_setter()
    {
        var container = new Container(cfg =>
        {
            cfg.ForConcreteType<Dummy>().Configure.Setter<IFoo>().Is(new Foo());
            cfg.ForConcreteType<Dummy2>().Configure.Setter<IFoo>().Is(new Foo2());
        });

        container.GetInstance<Dummy>().Foo.ShouldBeOfType<Foo>();
        container.GetInstance<Dummy2>().Foo.ShouldBeOfType<Foo2>();
    }
}
公共接口IFoo{}
公共类Foo:IFoo{}
公共类Foo2:IFoo{}
公共接口ID摘要
{
ifoofoo{get;set;}
}
公共类Dummy:IDummy
{
公共IFoo Foo{get;set;}
}
公共类Dummy2:IDummy
{
公共IFoo Foo{get;set;}
}
[测试夹具]
配置\u具体\u类型的公共类
{
[测试]
public void应使用\u配置的\u setter()
{
var容器=新容器(cfg=>
{
cfg.ForConcreteType().Configure.Setter().Is(new Foo());
cfg.ForConcreteType().Configure.Setter().Is(new Foo2());
});
container.GetInstance().Foo.ShouldBeOfType();
container.GetInstance().Foo.ShouldBeOfType();
}
}

我希望这能让您朝着正确的方向前进。

您不会向DI容器(StructureMap或其他容器)询问具体类型,因此谈论重新设置DummyContrete2是没有意义的。重新调整IDummy是有意义的。假设我有不同的接口具体实现。我想建造一个特定的混凝土,只是为了让混凝土的属性自动连接。我能做到吗?这是基本的DI。。或者我是从错误的方面攻击这个问题吗?像Mark一样,我同意通常情况下,您不应该依赖具体类型,而应该尝试坚持使用接口。也就是说。StructureMap能够返回具体类型,甚至支持它们的配置。我通常对简单对象使用具体类型,这些对象不会从抽象接口中获得太多好处,例如一些参数对象,如DatabaseSettings。如果您有多个具体类型,并且需要选择其中一个,则抽象工厂是最常见的解决方案:请参见此处的示例: