Dependency injection 混凝土类型的结构图<;T>;().Configure.SetProperty配置不符合构建逻辑

Dependency injection 混凝土类型的结构图<;T>;().Configure.SetProperty配置不符合构建逻辑,dependency-injection,structuremap,Dependency Injection,Structuremap,正在尝试了解如何为属性设置器注入配置StructureMap。我有通过容器解析实例的场景,也有在别处获取实例然后调用congainer.build()特性的场景 我在下面包含了一组示例类,我想在其中为混凝土类型栏配置注入。如果我使用下面标记为1)-5)的不同选项,我将从StructureMap获得不同的行为。有些情况必须失败,因为它们是不完整的,但是我在Foo和Qux属性上配置注入的所有情况都应该有效。他们没有。尤其是.build()功能不起作用 与其让我详细解释每个结果,不如让Structur

正在尝试了解如何为属性设置器注入配置StructureMap。我有通过容器解析实例的场景,也有在别处获取实例然后调用congainer.build()特性的场景

我在下面包含了一组示例类,我想在其中为混凝土类型栏配置注入。如果我使用下面标记为1)-5)的不同选项,我将从StructureMap获得不同的行为。有些情况必须失败,因为它们是不完整的,但是我在Foo和Qux属性上配置注入的所有情况都应该有效。他们没有。尤其是.build()功能不起作用

与其让我详细解释每个结果,不如让StructureMap wiz指出我的逻辑中的缺陷和/或运行示例代码

我想围绕配置还有其他的工作,但我希望能够明确说明我希望在Bar上注入什么

提前谢谢

[TestClass]
public class StructureMapTests
{
    public interface IFoo { }
    public interface IBaz { }
    public interface IQux { }

    private class Foo : IFoo { }

    private class Baz : IBaz { }

    private class Qux : IQux { }

    private class Bar
    {
        public IFoo Foo { get; set; }

        public IFoo FooSomething { get; set; }

        public IBaz Baz { get; set; }

        public IQux Qux { get; set; }
    }

    Container Container;

    [TestInitialize]
    public void Configure_StructureMap()
    {
        Container = new Container();
        Container.Configure(x =>
            {
                x.For<IFoo>().Use<Foo>();
                x.For<IBaz>().Use<Baz>();
                x.For<IQux>().Use<Qux>();

                x.FillAllPropertiesOfType<IBaz>();
                x.SetAllProperties(policy =>
                {
                    policy.NameMatches(name => name.EndsWith("Something"));
                });

                // 1)
                //x.ForConcreteType<Bar>().Configure.SetProperty(r => r.Foo = new Foo());
                //x.ForConcreteType<Bar>().Configure.Setter<IQux>().IsTheDefault();

                // 2)
                //x.ForConcreteType<Bar>().Configure.SetProperty(r => r.Foo = new Foo());

                // 3)
                //x.ForConcreteType<Bar>().Configure.Setter<IQux>().IsTheDefault();

                // 4)
                //x.ForConcreteType<Bar>().Configure.Setter<IQux>().IsTheDefault().SetProperty(r => r.Foo = new Foo());

                // 5)
                //x.ForConcreteType<Bar>().Configure.SetProperty(r => r.Foo = new Foo()).Setter<IQux>().IsTheDefault();
            });
    }

    [TestMethod]
    public void Resolve_Bar_through_container()
    {
        var bar = Container.GetInstance<Bar>();

        Debug.WriteLine("Resolve:");
        Debug.WriteLine(string.Format("Foo is {0}null.", bar.Foo == null ? "" : "not "));
        Debug.WriteLine(string.Format("FooSomething is {0}null.", bar.FooSomething == null ? "" : "not "));
        Debug.WriteLine(string.Format("Baz is {0}null.", bar.Baz == null ? "" : "not "));
        Debug.WriteLine(string.Format("Qux is {0}null.", bar.Qux == null ? "" : "not "));

        Assert.IsTrue(bar.Foo != null && bar.FooSomething != null && bar.Baz != null && bar.Qux != null);
    }

    [TestMethod]
    public void BuildUp_instance_of_bar()
    {
        var bar = new Bar();
        Container.BuildUp(bar);

        Debug.WriteLine("Build up:");
        Debug.WriteLine(string.Format("Foo is {0}null.", bar.Foo == null ? "" : "not "));
        Debug.WriteLine(string.Format("FooSomething is {0}null.", bar.FooSomething == null ? "" : "not "));
        Debug.WriteLine(string.Format("Baz is {0}null.", bar.Baz == null ? "" : "not "));
        Debug.WriteLine(string.Format("Qux is {0}null.", bar.Qux == null ? "" : "not "));

        Assert.IsTrue(bar.Foo != null && bar.FooSomething != null && bar.Baz != null && bar.Qux != null);
    }
}
[TestClass]
公共类StructureMapptests
{
公共接口IFoo{}
公共接口IBaz{}
公共接口iqx{}
私有类Foo:IFoo{}
私有类Baz:IBaz{}
私有类Qux:iqx{}
私人酒吧
{
公共IFoo Foo{get;set;}
公共IFoo对象{get;set;}
公共IBaz Baz{get;set;}
公共iqx Qux{get;set;}
}
集装箱;
[测试初始化]
public void Configure_StructureMap()
{
容器=新容器();
Container.Configure(x=>
{
x、 For().Use();
x、 For().Use();
x、 For().Use();
x、 FillAllPropertiesOfType();
x、 SetAllProperties(策略=>
{
policy.NameMatches(name=>name.EndsWith(“某物”);
});
// 1)
//x、 ForConcreteType().Configure.SetProperty(r=>r.Foo=newfoo());
//x、 ForConcreteType().Configure.Setter().IsTheDefault();
// 2)
//x、 ForConcreteType().Configure.SetProperty(r=>r.Foo=newfoo());
// 3)
//x、 ForConcreteType().Configure.Setter().IsTheDefault();
// 4)
//x、 ForConcreteType().Configure.Setter().IsTheDefault().SetProperty(r=>r.Foo=new Foo());
// 5)
//x、 ForConcreteType().Configure.SetProperty(r=>r.Foo=new Foo()).Setter().IsTheDefault();
});
}
[测试方法]
通过容器()解析公共无效条
{
var bar=Container.GetInstance();
Debug.WriteLine(“解析:”);
Debug.WriteLine(string.Format(“Foo是{0}null.”,bar.Foo==null?”:“不是”);
Debug.WriteLine(string.Format(“footsomething是{0}null.”,bar.footsomething==null?”:“not”);
Debug.WriteLine(string.Format(“Baz是{0}null.”,bar.Baz==null?”:“不是”);
Debug.WriteLine(string.Format(“Qux是{0}null.”,bar.Qux==null?”:“不是”);
Assert.IsTrue(bar.Foo!=null&&bar.footsomething!=null&&bar.Baz!=null&&bar.Qux!=null);
}
[测试方法]
_bar()的公共无效构建_实例_
{
var bar=新的bar();
容器.堆积物(巴);
Debug.WriteLine(“构建:”);
Debug.WriteLine(string.Format(“Foo是{0}null.”,bar.Foo==null?”:“不是”);
Debug.WriteLine(string.Format(“footsomething是{0}null.”,bar.footsomething==null?”:“not”);
Debug.WriteLine(string.Format(“Baz是{0}null.”,bar.Baz==null?”:“不是”);
Debug.WriteLine(string.Format(“Qux是{0}null.”,bar.Qux==null?”:“不是”);
Assert.IsTrue(bar.Foo!=null&&bar.footsomething!=null&&bar.Baz!=null&&bar.Qux!=null);
}
}

您可以使用
OnCreationForAll
方法注册
条的属性

container.Configure(r=>r.For().OnCreationForAll(bar=>
{
bar.Foo=container.GetInstance();
bar.foosthing=container.GetInstance();
bar.Baz=container.GetInstance();
bar.Qux=container.GetInstance();
})); 

您可以使用
OnCreationForAll
方法注册
条的属性

container.Configure(r=>r.For().OnCreationForAll(bar=>
{
bar.Foo=container.GetInstance();
bar.foosthing=container.GetInstance();
bar.Baz=container.GetInstance();
bar.Qux=container.GetInstance();
}));