Задача
У меня есть определение сообщения protobuf с полем MessageType
, которое является enum. Учитывая входящее сообщение protobuf, я хотел бы разрешить некоторые IMessageHandler
с из контейнера IoC на основе MessageType
. Проблема двоякая: как выразить ограничение MessageType
при написании IMessageHandler
и как разрешить только нужные обработчики из контейнера IoC?
Я использую Autofac, но мне интересны слуховые решения для любого контейнера.
Мои мысли:
Для выражения ограничения я вижу две опции: свойство или атрибут (нельзя использовать обобщенные значения, потому что это значение перечисления). Мне нравится свойство, потому что оно делает невозможным запись IMessageHandler
без указания ограничения, но недостатком является то, что его необходимо создать, прежде чем вы сможете увидеть значение свойства.
В моем текущем коде я использую подход с использованием свойств. Я разрешаю все IMessageHandler
s и выполняю фильтрацию вручную, но, похоже, должен быть лучший способ. Не то, чтобы я слишком беспокоился о производительности, это просто отчасти пахнет тем, что я решаю случаи, которые не привыкают.
Обновление
Чтобы было немного яснее, вот что я делаю сейчас
public interface IMessageHandler
{
MessageType TargetType { get; }
void Handle(IMessage message);
}
public class SomeHandler : IMessageHandler
{
public MessageType TargetType
{
get { return MessageType.Type1; }
}
public void Handle(IMessage message)
{
// implementation
}
}
Поэтому, когда я получаю сообщение protobuf, я разрешаю все IMessageHandler
s и вызываю те, чей TargetType
соответствует MessageType
входящего сообщения.