Контейнер Windsor: регистрация вещей в коде и XML

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

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

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


person George Mauer    schedule 18.09.2008    source источник


Ответы (1)


Я всегда считал, что просмотр модульного теста - лучший способ научиться использовать проект с открытым исходным кодом. 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

person Chris Canal    schedule 18.09.2008
comment
Спасибо за прекрасный ответ! Придется покопаться в этом. Откуда берется метод .Register на WindsorContaienr? Я не вижу этого через свой intellisense. Это метод расширения? - person George Mauer; 18.09.2008
comment
Вау ... Репозиторий Castle не работает Репозиторий отключен (администратором). - person George Mauer; 18.09.2008