温莎城堡: - 通过配置注入接口字典

时间:2009-05-20 21:14:36

标签: c# inversion-of-control castle-windsor

您好我正在尝试注入接口字典但是我从这样的城堡收到错误: -

Castle.MicroKernel.SubSystems.Conversion.ConverterException:没有注册转换器来处理类型IFoo

为了绕过异常,我必须创建一个包含Ifoo接口列表的包装器并使用属性返回它。然后在配置中使用包装器==>字典而不是字典

在城堡中是否有办法让我可以使用Interface的字典而不是执行此解决方法?

public interface IFoo {}
public class Foo {}
public class IfooWrapper {
    IList<IFoo> container{get;set;}
}

2 个答案:

答案 0 :(得分:6)

这对我来说很好(Windsor 2.0):

namespace WindsorTests {
    public interface IService {}    
    public class Service1 : IService {}    
    public class Service2 : IService {}    
    public class Consumer {
        private readonly IDictionary<string, IService> services;    
        public IDictionary<string, IService> Services {
            get { return services; }
        }    
        public Consumer(IDictionary<string, IService> services) {
            this.services = services;
        }
    }    

    [TestFixture]
    public class WindsorTests {    
        [Test]
        public void DictTest() {
            var container = new WindsorContainer(new XmlInterpreter(new StaticContentResource(@"<castle>
<components>
    <component id=""service1"" service=""WindsorTests.IService, MyAssembly"" type=""WindsorTests.Service1, MyAssembly""/>
    <component id=""service2"" service=""WindsorTests.IService, MyAssembly"" type=""WindsorTests.Service2, MyAssembly""/>
    <component id=""consumer"" type=""WindsorTests.Consumer, MyAssembly"">
        <parameters>
            <services>
                <dictionary>
                    <entry key=""one"">${service1}</entry>
                    <entry key=""two"">${service2}</entry>
                </dictionary>
            </services>
        </parameters>
    </component>
</components>
</castle>")));
            var consumer = container.Resolve<Consumer>();
            Assert.AreEqual(2, consumer.Services.Count);
            Assert.IsInstanceOfType(typeof(Service1), consumer.Services["one"]);
            Assert.IsInstanceOfType(typeof(Service2), consumer.Services["two"]);
        }
    }
}

答案 1 :(得分:0)

我必须做一些非常相似的事情。但是我觉得它暴露了设计缺陷比什么都重要。我重构了我的应用程序,以便它完成了你的包装类所做的标准工作方式。它也大大简化了应用程序。

这真的只是做“温莎城堡”的事情,而不是试图让“我的方式”适应温莎城堡模型。看到温莎城堡的方式更加容易和更好,这真是令人羞愧......

从技术上讲,这不是你提出的问题的解决方案,但希望它可以帮助你。