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