Я бы порекомендовал использовать неявные типы отношений Meta<T>
и Lazy<T>
, чтобы процессор мог читать конфигурацию и контролировать все это во время выполнения. Это также позволит вам по-разному фильтровать в различных условиях или полностью отключить фильтрацию без необходимости менять какие-либо клавиши.
Зарегистрируйте обработчики с метаданными, а не как службы с ключами ...
builder.RegisterType<Handler1>()
.As<IHandler>()
.WithMetadata("type", HandlerType.One);
builder.RegisterType<Handler2>()
.As<IHandler>()
.WithMetadata("type", HandlerType.Two);
builder.RegisterType<Handler3>()
.As<IHandler>()
.WithMetadata("type", HandlerType.Three);
Обновите ваш процессор, чтобы он принимал IEnumerable<Meta<Lazy<IHandler>>>
и фильтруйте во время построения или в более поздний момент, когда понадобятся обработчики, ваш вызов.
public class Processor
{
private readonly IHandler[] _handlers;
public Processor(IEnumerable<Meta<Lazy<IHandler>>> handlers)
{
this._handlers =
handlers
.Where(h => h.Metadata["type"] == HandlerType.One || h.Metadata["type"] == HandlerType.Three)
.Select(h => h.Value.Value)
.ToArray();
}
}
Каждый элемент, поступающий в конструктор, будет Meta<Lazy<IHandler>>
:
Meta<T>
имеет Metadata
словарь для запроса, а Value
будет Lazy<IHandler>
.
Lazy<T>
не разрешит / не создаст обработчик, пока вы не вызовете свойство Value
, поэтому оно не будет дорогим или приведет к нежелательным разрешениям.
Так что item.Value.Value
будет разрешено IHandler
(как вы видите в LINQ выше).
Материал в фильтре Where
может быть основан на конфигурации или чем-то еще. Но настоящая победа здесь в том, что если вам все еще нужно разрешить все обработчики где-то еще ...
public OtherHandlerConsumer(IEnumerable<IHandler> handlers)
... это все еще будет работать. Вы не можете сделать это, если они все включены. Кроме того, вы можете добавить столько метаданных, сколько захотите, к регистрациям или даже определить более надежные строго типизированные метаданные , чтобы вы могли принимать более взвешенные решения о том, какие обработчики вы хотите.