Виндзорский замок: - Введите словарь интерфейсов через конфигурацию - PullRequest
3 голосов
/ 21 мая 2009

Привет, я пытаюсь ввести словарь интерфейсов, но получаю сообщение об ошибке из замка, как это: -

Castle.MicroKernel.SubSystems.Conversion.ConverterException: не зарегистрирован преобразователь для обработки типа IFoo

Чтобы обойти исключение, мне пришлось создать оболочку, которая содержала бы список интерфейса Ifoo и возвращала его, используя свойство. Оболочка затем использовалась в словаре конфигурации ==> вместо словаря

Есть ли способ в замке, чтобы я мог просто использовать словарь интерфейса вместо этого обходного пути?

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

Ответы [ 2 ]

6 голосов
/ 29 мая 2009

Это прекрасно работает для меня (Виндзор 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"]);
        }
    }
}
0 голосов
/ 21 мая 2009

Мне пришлось сделать что-то очень похожее. Однако я думаю, что это выявило недостаток дизайна больше, чем что-либо еще. Я реорганизовал свое приложение так, чтобы оно выполняло то, что делает ваш класс-оболочку, в качестве стандартного способа работы. Это значительно упростило приложение.

На самом деле все было просто делом «Виндзорского пути» вместо того, чтобы пытаться адаптировать «мой путь» к модели Виндзорского замка. Было довольно унизительно видеть, насколько легче и лучше был путь Виндзорского замка ...

Технически это не решение проблемы, которую вы поставили, но, надеюсь, это поможет вам.

...