2015-03-17 1 views
2

Я пытаюсь реализовать конвенционную регистрацию с Castle Windsor, но я не могу понять, как справиться с заменой реализации приложений по умолчанию.Зарегистрировать компоненты Castle Windsor по умолчанию, используя пользовательские компоненты

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

public interface ILogger 
{ 
    void Info(string message); 
} 

public class Logger : ILogger 
{ 
    public void Info(string message) 
    { 
     Console.WriteLine(message); 
    } 
} 

В типичном случае использования, я хочу замок Виндзор зарегистрировать Logger с сервисом ILogger.

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

public class CustomLogger : ILogger 
{ 
    public void Info(string message) 
    { 
     Console.WriteLine("[LOG]: {0}", message); 
    } 
} 

В этом прецеденте, я хочу замок Виндзор зарегистрировать CustomLogger с ILogger службы вместо Logger.

До сих пор я пытался что-то вроде многоуровневого подхода, при котором я попытка зарегистрировать все интерфейсы по умолчанию, а затем интерфейсы не по умолчанию:

using (var container = new WindsorContainer()) 
{ 
    container.Register(
     Classes.FromAssemblyInDirectory(new AssemblyFilter(pluginDirectoryPath)) 
      .Where(type => true) 
      .WithService.DefaultInterfaces(), 
     Classes.FromAssemblyInDirectory(new AssemblyFilter(pluginDirectoryPath)) 
      .Where(type => true) 
      .WithService.AllInterfaces()); 

    var logger = container.Resolve<ILogger>(); 
    logger.Info("hello, world!"); 
} 

Однако, это не похоже на работу так как Logger и CustomLogger регистрируются в ILogger, но я все равно возвращаюсь к Logger, когда я разрешаю ILogger. Какие-нибудь советы о том, как это сделать?

Кроме того, я не могу зарегистрировать каждый компонент и услугу индивидуально, так как корень композиции является его собственным исполняемым файлом отдельно от клиентского кода, поэтому он имеет очень ограниченное знание о том, какие службы доступны, не выполняя некоторого сборочного сканирования.

+1

Я понятия не имею, как это сделать с помощью метода «автоматического сканирования», но для отдельной регистрации (ов) это требует 1) установки «IsFallback» на компонент по умолчанию; * или * 2), устанавливая уникальное имя компонента * и *, используя 'IsDefault' для переопределений. См. Http://stackoverflow.com/questions/9253388/in-castle-windsor-3-override-an-existing-component-registration – user2864740

+0

Ах да, я только что видел этот ответ относительно IsFallback, но я не мог понять как сделать то же самое с Classes.FromAssemblyInDirectory – user1777663

+1

В отсутствие IsFallback и IsDefault первая зарегистрированная победа. Не могли бы вы сначала зарегистрировать свои нестандартные реализации, а затем зарегистрировать свои реализации по умолчанию, чтобы заполнить пробелы? –

ответ

1

Первые зарегистрированные выигрыши, поэтому ... сначала зарегистрируйте свои нестандартные реализации, а затем зарегистрируйте свои реализации по умолчанию, чтобы заполнить пробелы.

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

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