鉴于以下配置
Container.Register(Component.For<A>().Named("foo"));
Container.Register(Component.For<B>().Named("foobar"));
Container.Register(
AllTypes.Pick()
.FromAssemblyNamed("MyAssembly")
.If(t => t.Name.EndsWith("ABC"))
.Configure(c => c.LifeStyle.Is(LifestyleType.Transient))
.WithService.Select(i => typeof(I))
);
Container.Register(
AllTypes.Pick()
.FromAssemblyNamed("MyAssembly")
.If(t => t.Name.EndsWith("123"))
.Configure(c => c.LifeStyle.Is(LifestyleType.Transient))
.WithService.Select(i => typeof(I))
);
如果我知道界面“I”暴露属性“P”,并且A类和B类可以分配给P;我如何明确声明AllTypes调用中的第一个类型集合应该将属性P设置为id为“foo”的类型,并且第二个集合应该具有相同的属性设置为id为“foobar”的类型“?
使用XML配置可以通过使用$ {id}表示法显式设置参数来完成。我假设它在流畅的API中类似。
感谢。
答案 0 :(得分:2)
您走在正确的轨道上 - 您需要做的是配置每个组件的参数,提供名为“P”的参数,其值为“$ {foo}”或“$ {foobar}”,具体取决于您的方案,这是一个工作的xunit事实(向下滚动到实际的注册码的底部),它演示了你的场景。
namespace Question651392
{
public class First123 : I
{
public AbstractLetter P { get; set; }
}
public class Second123 : I
{
public AbstractLetter P { get; set; }
}
public class FirstABC : I
{
public AbstractLetter P { get; set; }
}
public class SecondABC : I
{
public AbstractLetter P { get; set; }
}
public interface I
{
AbstractLetter P { get; set; }
}
public abstract class AbstractLetter
{
}
public class B : AbstractLetter
{
}
public class A : AbstractLetter
{
}
public class RegistrationFacts
{
[Fact]
public void EnsureParametersCanBeSetWhenRegisteringComponentsInBulk()
{
WindsorContainer Container = new WindsorContainer();
Container.Register(Component.For<A>().Named("foo"));
Container.Register(Component.For<B>().Named("foobar"));
Container.Register(
AllTypes.Pick()
.FromAssembly(GetType().Assembly)
.If(t => t.Name.EndsWith("ABC"))
.Configure(c => c.LifeStyle.Is(LifestyleType.Transient))
.Configure(c=>c.Parameters(Parameter.ForKey("P").Eq("${foo}")))
.WithService.Select(new[] { typeof(I) })
);
Container.Register(
AllTypes.Pick()
.FromAssembly(GetType().Assembly)
.If(t => t.Name.EndsWith("123"))
.Configure(c => c.LifeStyle.Is(LifestyleType.Transient))
.Configure(c => c.Parameters(Parameter.ForKey("P").Eq("${foobar}")))
.WithService.Select(new[] { typeof(I)})
);
var all = Container.ResolveAll<I>();
var firstABC = all.Single(i => i is FirstABC);
Assert.IsType(typeof(A), firstABC.P);
var first123 = all.Single(i => i is First123);
Assert.IsType(typeof (B), first123.P);
Assert.Equal(4, all.Count());
}
}
}
希望这有帮助!
答案 1 :(得分:1)
有关测试此事的一件事。
第二次配置呼叫似乎取消了第一次呼叫。
.Configure(c => c.LifeStyle.Is(LifestyleType.Transient))
.Configure(c => c.Parameters(Parameter.ForKey("P").Eq("${foobar}")))
如果你加入测试
var all2 = Container.ResolveAll<I>();
Assert.IsTrue(all.Count(i => all2.Contains(i)) == 0);
它会失败,但是你会期望它过于通过,因为一切都被宣布为瞬态。 这意味着失去了短暂的生活方式,而使用了单身人士的默认生活方式。
将配置调用更改为以下内容会导致测试通过。
.Configure(c => .LifeStyle.Is(LifestyleType.Transient).Parameters(Parameter.ForKey("P").Eq("${foobar}")))
感谢。
答案 2 :(得分:1)
实际上要添加@Bittercoder的全面答案,推荐的方法是:
.DependsOn(Property.ForKey("P").Is("fooBar"))