Виндзорский Контейнер: Регистрация вещей в Code vs Xml - PullRequest
4 голосов
/ 18 сентября 2008

Из того, что я читал о Windsor / Microkernel, теоретически возможно сделать все, что вы можете, используя xml-файлы с кодом. На самом деле - и, пожалуйста, поправьте меня, если я ошибаюсь, - похоже, что основной вклад слоя Windsor заключается в добавлении конфигурации xml для того, что уже может делать Microkernel.

Однако в последнее время я пытался выяснить, как реализовать некоторые немного более сложные функции в коде (то есть. , как назначить значение аргумента конструктора по умолчанию ). Теперь, когда я собираюсь использовать xml в своей рабочей версии, я регистрирую компоненты в коде для своих тестов, и это становится довольно проблематичным. Это не помогло неудачным состоянием их документации и фактом, что единственные статьи, которые я могу найти, сосредоточены на регистрации XML.

Кто-нибудь знает источник, который перечисляет, как регистрировать вещи в коде (предпочтительно с эквивалентом xml)? Признавая существование этого, кто-нибудь просто знает о проекте с открытым исходным кодом / образце проекта, где широко используется не Виндзор / Микроядро Castle, не относящийся к XML?

1 Ответ

6 голосов
/ 18 сентября 2008

Я всегда находил, что, посмотрев на модульное тестирование, я узнал, как использовать проект с открытым исходным кодом. Castle имеет свободный интерфейс, который позволит вам делать все в коде. Из теста WindsorDotNet2Tests :

[Test]
    public void ParentResolverIntercetorShouldNotAffectGenericComponentInterceptor()
    {
        WindsorContainer container = new WindsorContainer();
        container.AddComponent<MyInterceptor>();

        container.Register(
            Component.For<ISpecification>()
                .ImplementedBy<MySpecification>()
                .Interceptors(new InterceptorReference(typeof(MyInterceptor)))
                .Anywhere
            );
        container.AddComponent("repos", typeof(IRepository<>), typeof(TransientRepository<>));

        ISpecification specification = container.Resolve<ISpecification>();
        bool isProxy = specification.Repository.GetType().FullName.Contains("Proxy");
        Assert.IsFalse(isProxy);
    }

И для более подробной информации, ознакомьтесь с ComponentRegistrationTestCase и AllTypesTestCase

Существует также DSL для этого, это мой предпочтительный вариант, так как он действительно упрощает вещи и предлагает много легкой расширяемости. DSL называется Binsor, о чем вы можете прочитать здесь: http://www.ayende.com/Blog/archive/7268.aspx Но, опять же, лучшее место для информации - это модульные тесты. Вот пример кода того, что возможно с помощью binsor:

for type in AllTypesBased of IController("Company.Web.Controller"):
    component type

Эти две строки будут регистрировать любой тип, который наследует интерфейс IController, в контейнер: D

...