Виндзорский документ говорит, что мы можем передать параметры в TypedFactory
вызовах метода, и эти параметры будут переданы в конструктор типа, который создает фабрика:
Вы также можете использовать методы, которые принимают параметры от вызывающей стороны для разрешения компонентов. Передаваемый аргумент будет передан конвейеру разрешения контейнера.
Как это работает при использовании обычной регистрации? Я получаю исключение при проверке того, что нет отсутствующих компонентов и что моя конфигурация верна, говоря, что тип, который я хочу передать моему конструктору, не был зарегистрирован.
Например, возьмите следующий код:
public interface IWatcherFactory : IDisposable
{
IWatcher GetWatcher(ImportTarget importTarget);
}
который зарегистрирован с container.Register(Component.For<IWatcherFactory>().AsFactory());
public class FolderWatcher : WatcherBase
{
public FolderWatcher(ImportTarget importTarget, ILogger logger, IClock clock, IFileSystem fileSystem)
: base(importTarget, logger)
{
// ...
}
}
, где WatcherBase
-
public abstract class WatcherBase : IWatcher
{
public WatcherBase(ImportTarget importTarget, ILogger logger)
{
// ...
}
}
которые зарегистрированы с container.Register(Classes.FromThisAssembly().BasedOn<IWatcher>().WithServiceAllInterfaces().LifestyleTransient());
Теперь другие вопросы и ответы скажем имена параметров должны совпадать, чтобы это работало, что мое уже делает.
Это точная ошибка, которую я получаю:
'FolderWatcher' is waiting for the following dependencies:
- Service 'ImportTarget' which was not registered.
Мне кажется, проблема в том, что Виндзор ничего не говорит о том, что зависимость от ImportTarget
существует из-за регистрации соглашения, но я не уверен.
У меня также есть селектор компонентов, который выглядит следующим образом:
public class WatcherFactoryComponentSelector : DefaultTypedFactoryComponentSelector
{
protected override string GetComponentName(MethodInfo method, object[] arguments)
{
var config = arguments.FirstOrDefault() as ImportTarget;
if (config == null)
{
return base.GetComponentName(method, arguments);
}
return config.WatcherFullyQualifiedName;
}
}
которое зарегистрировано так: container.Register(Component.For<ITypedFactoryComponentSelector>().ImplementedBy<WatcherFactoryComponentSelector>());