Использование Ninject IOC для замены фабрики - PullRequest
14 голосов
/ 20 января 2010

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

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

kernel.Get<ITokenHandler>(tokenName); 

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

Ответы [ 2 ]

11 голосов
/ 21 января 2010

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

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

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

Если я что-то упустил, дайте мне знать.

1 голос
/ 20 января 2010

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

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

...