Использование Ninject IOC для замены фабрики
-
21-09-2019 - |
Вопрос
У меня есть фабричный метод внутри парсера.По сути, когда я загружаю токен, я ищу обработчик этого токена или перехожу к обработчику по умолчанию.Я реализовал это как switch
и как Dictionary<string,Type>
но оба подхода требуют, чтобы я хранил сопоставление где-то еще, кроме класса-обработчика.
Мы используем Ninject для IOC, и я понял, что могу сделать это, используя
kernel.Get<ITokenHandler>(tokenName);
но это не спасает меня от хранения информации о том, с каким токеном может работать обработчик, в двух местах.Есть ли способ украсить обработчик, чтобы он автоматически отображался?
Решение
Если я правильно понимаю ваш вопрос, похоже, вы хотите получить именованную привязку.Вы не указали, какую версию Ninject вы используете, но, судя по вашему фрагменту кода, я предполагаю, что вы используете Ninject 2.0.Если это так, то я думаю, этого будет достаточно для вашей привязки в вашем модуле:
Bind<ITokenHandler>().To<YourConcreteTypeHere>().Named(tokenName);
Вы привязываете как можно больше конкретных типов к одному и тому же интерфейсу и различаете их по имени, а затем извлекаете их, используя точный синтаксис, который вы указали в своем вопросе.
Если мне не хватает чего-то ключевого, дайте мне знать.
Другие советы
Один из методов, который я использовал, - это Bind
таким образом, что вы можете потребовать передачу параметра (в контексте) в тот момент, когда вы хотите, чтобы кто-то что-то выбрал.
Между http://ninject.codeplex.com/wikipage?title=Providers%20and%20the%20Activation%20Context и http://ninject.codeplex.com/wikipage?title=Contextual%20Binding вы должны уметь связывать вещи таким образом, чтобы можно было сказать Only(When.Context...)
чтобы выбор работал?