Я пытаюсь реализовать конвенционную регистрацию с 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) установки «IsFallback» на компонент по умолчанию; * или * 2), устанавливая уникальное имя компонента * и *, используя 'IsDefault' для переопределений. См. Http://stackoverflow.com/questions/9253388/in-castle-windsor-3-override-an-existing-component-registration – user2864740
Ах да, я только что видел этот ответ относительно IsFallback, но я не мог понять как сделать то же самое с Classes.FromAssemblyInDirectory – user1777663
В отсутствие IsFallback и IsDefault первая зарегистрированная победа. Не могли бы вы сначала зарегистрировать свои нестандартные реализации, а затем зарегистрировать свои реализации по умолчанию, чтобы заполнить пробелы? –