У меня есть метод 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...)
, чтобы сделать выбор?