城堡温莎ArrayResolver ServiceOverrides不遵守
问题描述:
当使用ArrayResolver,如果我寄存器实现相同的接口的多个依赖关系和我有注册类依赖这些依赖关系在阵列上,可以预期被尊重ServiceOverrides并允许控制哪些依赖关系被注入到构造器中。相反,我已经看到并编写了测试,显示每个依赖项被注入到注册类构造器中。城堡温莎ArrayResolver ServiceOverrides不遵守
using System.Linq;
using Castle.MicroKernel.Registration;
using Castle.MicroKernel.Resolvers.SpecializedResolvers;
using Castle.MicroKernel.SubSystems.Configuration;
using Castle.Windsor;
using NUnit.Framework;
namespace ServiceFramework.UnitTests
{
public class ArrayResolver_ServiceOverridesNotRespected
{
private class TestInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(
Component.For<IDependency>().ImplementedBy<Foo>().Named("foo"),
Component.For<IDependency>().ImplementedBy<Bar>().Named("bar"),
Component.For<IDependency>().ImplementedBy<Baz>().Named("baz"),
Component.For<IDependOnArray>().ImplementedBy<DependsOnArray>().Named("InjectAll"),
Component.For<IDependOnArray>().ImplementedBy<DependsOnArray>().Named("InjectFooOnly").ServiceOverrides(
ServiceOverride.ForKey("steps").Eq(new[] {"foo"})),
Component.For<IDependOnArray>().ImplementedBy<DependsOnArray>().Named("InjectFooAndBarOnly").ServiceOverrides(
ServiceOverride.ForKey("steps").Eq(new[] {"foo", "bar"})));
}
}
public interface IDependency
{
}
public class Foo : IDependency
{
}
public class Bar : IDependency
{
}
public class Baz : IDependency
{
}
public interface IDependOnArray
{
IDependency[] GetDependencies();
}
public class DependsOnArray : IDependOnArray
{
private readonly IDependency[] _steps;
public DependsOnArray(IDependency[] steps)
{
_steps = steps;
}
public IDependency[] GetDependencies()
{
return _steps;
}
}
[Test]
public void InjectFooOnly_WithoutArrayResolver()
{
using (var container = new WindsorContainer())
{
container.Install(new TestInstaller());
var fooItemTest = container.Resolve<IDependOnArray>("InjectFooOnly");
var dependencies = fooItemTest.GetDependencies().Select(d => d.GetType()).ToList();
Assert.That(dependencies, Has.Count.EqualTo(1));
Assert.That(dependencies, Has.Member(typeof(Foo)));
}
}
[Test]
[ExpectedException(typeof(AssertionException))]
public void InjectFooOnly_WithArrayResolver()
{
using (var container = new WindsorContainer())
{
container.Kernel.Resolver.AddSubResolver(new ArrayResolver(container.Kernel, true));
container.Install(new TestInstaller());
var fooItemTest = container.Resolve<IDependOnArray>("InjectFooOnly");
var dependencies = fooItemTest.GetDependencies().Select(d => d.GetType()).ToList();
Assert.That(dependencies, Has.Count.EqualTo(1));
Assert.That(dependencies, Has.Member(typeof(Foo)));
}
}
[Test]
public void InjectFooAndBarOnly_WithoutArrayResolver()
{
using (var container = new WindsorContainer())
{
container.Install(new TestInstaller());
var fooItemTest = container.Resolve<IDependOnArray>("InjectFooAndBarOnly");
var dependencies = fooItemTest.GetDependencies().Select(d => d.GetType()).ToList();
Assert.That(dependencies, Has.Count.EqualTo(2));
Assert.That(dependencies, Has.Member(typeof(Foo)));
Assert.That(dependencies, Has.Member(typeof(Bar)));
}
}
[Test]
[ExpectedException(typeof(AssertionException))]
public void InjectFooAndBarOnly_WithArrayResolver()
{
using (var container = new WindsorContainer())
{
container.Kernel.Resolver.AddSubResolver(new ArrayResolver(container.Kernel, true));
container.Install(new TestInstaller());
var fooItemTest = container.Resolve<IDependOnArray>("InjectFooAndBarOnly");
var dependencies = fooItemTest.GetDependencies().Select(d => d.GetType()).ToList();
Assert.That(dependencies, Has.Count.EqualTo(2));
Assert.That(dependencies, Has.Member(typeof(Foo)));
Assert.That(dependencies, Has.Member(typeof(Bar)));
}
}
[Test]
public void InjectAll()
{
using (var container = new WindsorContainer())
{
container.Kernel.Resolver.AddSubResolver(new ArrayResolver(container.Kernel, true));
container.Install(new TestInstaller());
var fooItemTest = container.Resolve<IDependOnArray>("InjectAll");
var dependencies = fooItemTest.GetDependencies().Select(d => d.GetType()).ToList();
Assert.That(dependencies, Has.Count.EqualTo(3));
Assert.That(dependencies, Has.Member(typeof(Foo)));
Assert.That(dependencies, Has.Member(typeof(Bar)));
Assert.That(dependencies, Has.Member(typeof(Baz)));
}
}
}
}
答
现在问题已经解决,修复程序将成为下一个主要版本的温莎的一部分。
的海报是我的同事,我们已经证实,在这两个温莎城堡2.5.0和2.5.1存在这种行为,那CollectionResolver显示相同的行为。在使用“DependsOn”语法指定2.5.1中的服务覆盖时,我也会看到相同的行为。我不知道这是由设计或没有,但是这肯定看起来像非直观的行为。我希望显式指定参数优先于子依赖关系解析器。 – 2010-10-25 20:51:45
这里是在城堡issuetracker问题:http://issues.castleproject.org/issue/IOC-240 – roelofb 2010-10-26 07:28:22