2015-03-19 1 views
2

Я пытаюсь использовать Castle.Windsor (3.2.0.0) convention based registration, но не могу понять, как регистрировать классы, реализующие конкретный интерфейс только в определенном пространстве имен.Как регистрировать классы по интерфейсу и пространству имен с помощью Windsor?

например. что я действительно хочу, чтобы иметь возможность написать что-то вроде этого:

container.Register(Classes.FromThisAssembly() 
          .InNamespace("MyApp.EventHandlers") 
          .BasedOn(typeof(IHandlesEvent<>)) 
          .WithServiceAllInterfaces() 

Но я получаю предупреждение, что, кажется, подразумевает, что это будет действительно сделать, это зарегистрировать все в EventHandlers пространстве имен, а затем все, что в текущей сборке, реализует IHandlesEvent<>.

Если я запускаю приложение, это действительно похоже на то, что происходит. Я не хочу, чтобы все, что реализует этот интерфейс для регистрации (например, некоторые из классов реализации - это Sagas, которые необходимо отслеживать вручную), и я действительно не хочу, чтобы все в этом пространстве имен было зарегистрировано.

Я действительно не хочу регистрировать обработчики событий по отдельности, но я не могу видеть из документации Windsor, как делать то, что мне нужно по соглашению. Является ли это возможным?

+0

Я никогда не замечал этого, v. Интересного и удивительного поведения. Я бы подумал, что эта конструкция будет внутренне разрешать список фильтров, однако это даже не похоже, что это конечный результат – samy

ответ

2

Я тоже удивлен, но я мог наблюдать за поведением на замке 3.2. BasedOn толкнул предупреждение о том, что было бы переинициализировать регистрации: вот мой пример кода:

namespace WindsorTest 
{ 
    public interface IHandlesEvent {} 

    public interface IDontWantToBeRegistered {} 

    namespace Select 
    { 
     public class SelectClass : IHandlesEvent { } 
     public class DontRegisterMe : IDontWantToBeRegistered { } 
    } 

    namespace DontSelect 
    { 
     public class DontSelectClass: IHandlesEvent {} 
    } 


    internal class Program 
    { 
     private static void Main(string[] args) 
     { 
      var container = new WindsorContainer(); 
      container.Register(Classes.FromThisAssembly() 
       .InNamespace("WindsorTest.Select") 
       .BasedOn<IHandlesEvent>() 
       .WithServiceAllInterfaces() 
       ); 
      foreach (var handler in container.ResolveAll<IHandlesEvent>()) 
      { 
       Console.WriteLine(handler.GetType().Name); 
      } 

      foreach (var handler in container.ResolveAll<IDontWantToBeRegistered>()) 
      { 
       Console.WriteLine(handler.GetType().Name); 
      } 
      Console.ReadLine(); 
     } 
    } 
} 

Он выводит DontSelectClass когда бежал.

Однако я нашел способ начать с базового класса для вашей регистрации и затем уточнить его с помощью пространства имен. Просто используйте:

container.Register(Classes.FromThisAssembly() 
    .BasedOn<IHandlesEvent>() 
    .If(t => t.Namespace == "WindsorTest.Select") 
    .WithServiceAllInterfaces() 
    ); 

 Смежные вопросы

  • Нет связанных вопросов^_^