我很难有条件地创建依赖项。谷歌搜索,我还没有找到使用 BuildStack 和条件谓词的好例子。
这是我在注册表中所做的:
//snip
public SomeRegistry()
{
this.InstanceOf<IFoo>().Is.Conditional(
c =>
{
c.TheDefault.Is.ConstructedBy(() => new FooZ());
c.If(
p => p.ParentType.IsAssignableFrom(typeof(IBar)) &&
p.BuildStack.Current.RequestedType.IsAssignableFrom(typeof(IDoStuffWithFooA)))
.ThenIt.Is.ConstructedBy(() => new FooA());
c.If(
p => p.ParentType.IsAssignableFrom(typeof(IBar)) &&
p.BuildStack.Current.RequestedType.IsAssignableFrom(typeof(IDoStuffWithFooB)))
.ThenIt.Is.ConstructedBy(() => new FooB());
});
this.Scan(
s =>
{
s.TheCallingAssembly();
s.WithDefaultConventions();
});
}
//snip
这是显示我所期待的单元测试
//snip
[TestFixture]
public class ConditionalCreationTest
{
[Test]
public void GiveUsFooAWhenDoingStuffWithA()
{
var dependA = ObjectFactory.GetInstance<IDoStuffWithFooA>();
Assert.IsInstanceOfType<FooA>(dependA.Foo);
}
[Test]
public void GiveUsFooBWhenDoingStuffWithB()
{
var dependB = ObjectFactory.GetInstance<IDoStuffWithFooB>();
Assert.IsInstanceOfType<FooB>(dependB.Foo);
}
[Test]
public void GiveUsFooZByDefault()
{
var foo = ObjectFactory.GetInstance<IFoo>();
Assert.IsInstanceOfType<FooZ>(foo);
}
[Test]
public void GiveUsProperFoosWhenWeDontAskDirectly()
{
var bar = ObjectFactory.GetInstance<IBar>();
Assert.IsInstanceOfType<FooA>(bar.DoStuffA.Foo);
Assert.IsInstanceOfType<FooB>(bar.DoStuffB.Foo);
}
[SetUp]
public void SetUp()
{
ObjectFactory.Initialize(a => a.AddRegistry<SomeRegistry>());
}
}
//snip
这就是我希望 StructureMap 与 IFoo 的正确依赖关系的 AutoWire:
//snip
public class Bar : IBar
{
private IDoStuffWithFooA doStuffA;
private IDoStuffWithFooB doStuffB;
public Bar(IDoStuffWithFooA doStuffA, IDoStuffWithFooB doStuffB)
{
this.doStuffA = doStuffA;
this.doStuffB = doStuffB;
}
public IDoStuffWithFooA DoStuffA
{
get
{
return this.doStuffA;
}
}
public IDoStuffWithFooB DoStuffB
{
get
{
return this.doStuffB;
}
}
}
//snip
我无法弄清楚如何让GiveUsProperFoosWhenWeDontAskDirectly
测试通过。
我想FooA
在我需要的时候进行初始化IDoStuffWithFooA
,什么FooB
时候IDoStuffWithFooB
,不管图表中什么时候需要它。 条件谓词的正确语法是什么?