Использование Ninject IOC для замены factory

У меня есть метод factory внутри парсера. По сути, когда я загружаю токен, я просматриваю обработчик для этого токена или перехожу к обработчику по умолчанию. Я реализовал это как switch и как Dictionary<string,Type>, но оба подхода требуют, чтобы я сохранил отображение где-то еще, кроме класса обработчика.

Мы используем Ninject для IOC, поэтому я понял, что могу сделать это, используя

kernel.Get<ITokenHandler>(tokenName); 

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

Ответ 1

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

Bind<ITokenHandler>().To<YourConcreteTypeHere>().Named(tokenName);

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

Если мне не хватает чего-то ключа, дайте мне знать.

Ответ 2

Один метод, который я использовал, - это Bind материал таким образом, что вам может потребоваться передача параметра (в контексте) в том месте, где вы хотите, чтобы кто-то выбрал что-то.

Между http://ninject.codeplex.com/wikipage?title=Providers%20and%20the%20Activation%20Context и http://ninject.codeplex.com/wikipage?title=Contextual%20Binding вы должны уметь связывать вещи таким образом, чтобы вы могли сказать Only(When.Context...), чтобы сделать выбор?