您好我正在尝试注入接口字典但是我从这样的城堡收到错误: -
Castle.MicroKernel.SubSystems.Conversion.ConverterException:没有注册转换器来处理类型IFoo
为了绕过异常,我必须创建一个包含Ifoo接口列表的包装器并使用属性返回它。然后在配置中使用包装器==>字典而不是字典
在城堡中是否有办法让我可以使用Interface的字典而不是执行此解决方法?
public interface IFoo {}
public class Foo {}
public class IfooWrapper {
IList<IFoo> container{get;set;}
}
答案 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)
我必须做一些非常相似的事情。但是我觉得它暴露了设计缺陷比什么都重要。我重构了我的应用程序,以便它完成了你的包装类所做的标准工作方式。它也大大简化了应用程序。
这真的只是做“温莎城堡”的事情,而不是试图让“我的方式”适应温莎城堡模型。看到温莎城堡的方式更加容易和更好,这真是令人羞愧......
从技术上讲,这不是你提出的问题的解决方案,但希望它可以帮助你。