2008-09-18 2 views
4

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

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

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

ответ

6

Я всегда рассматривал модульный тест как лучший способ узнать, как использовать проект с открытым исходным кодом. Замок имеет свободный интерфейс, который позволит вам делать все в коде. Из 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 Но опять же лучшим местом для инфо является Unit Tests. Это пример кода, Что можно с binsor:

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

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

+0

Спасибо спасибо за замечательный ответ! Мне придется в нее вникать. Где находится метод .Register на WindsorContaienr? Я не вижу этого через мой intellisense. Это метод расширения? – 2008-09-18 15:26:13