【问题标题】:Windsor Castle :- Inject Dictionary of Interfaces via configuration温莎城堡:- 通过配置注入接口字典
【发布时间】:2009-05-29 09:28:28
【问题描述】:

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

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

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

在城堡里有没有一种方法可以让我只拥有一个接口字典而不是做这个解决方法?

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

【问题讨论】:

  • 在这个字典中,服务是键还是值?
  • 服务就是价值

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


【解决方案1】:

这对我来说很好用(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"]);
        }
    }
}

【讨论】:

  • 啊哈,他们本可以在 windsor 2.0 中解决这个问题。我正在使用 1.0 rc 3
【解决方案2】:

我不得不做一些非常相似的事情。但是我认为它比其他任何东西都暴露了一个设计缺陷。我重构了我的应用程序,以便它完成您的包装类作为其标准工作方式所做的事情。它也极大地简化了应用程序。

这实际上只是按照“温莎城堡的方式”做事,而不是试图让“我的方式”适应温莎城堡的模式。看到温莎城堡的方式变得多么容易和更好,真是令人羞愧......

技术上不能解决您提出的问题,但希望它可以帮助您。

【讨论】:

  • 嗯,这不是一个解决方案,但这就是我的想法。但是对我来说没有意义的是允许接口列表,而不允许接口字典。包装类只是给配置增加了更多噪音。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多