Автоматический эквивалент функции Ninject WhenInjectedInto()

#asp.net-mvc-3 #dependency-injection #inversion-of-control #ninject #autofac

#asp.net-mvc-3 #внедрение зависимостей #инверсия управления #ninject #autofac

Вопрос:

Итак, мы работаем над преобразованием некоторых рабочих проектов из Ninject в Autofac, и мы наткнулись на что-то действительно интересное в Ninject, что мы не можем понять, как сделать в Autofac. В нашем приложении у нас есть вызываемый интерфейс ISession , который реализован в двух разных конкретных типах. Один отправляется в базу данных Oracle, а другой — в базу данных MS-SQL.

В нашем приложении MVC есть контроллеры, которым требуется только одна конкретная реализация ISession, основанная на том, в какой контроллер они вводятся. Например:

 Bind<IFoo>().To<Foo1>();
Bind<IFoo>().To<Foo2>().WhenInjectedInto<OracleController>();
  

Мой вопрос: как нам достичь того же результата в Autofac? Когда IFoo вводится в любой контроллер, Foo1 должно быть предусмотрено по умолчанию, однако в одном особом случае нам нужно Foo2 вместо этого.

Заранее спасибо за любую помощь!

Ответ №1:

С помощью Autofac вы можете добиться этого, выполнив регистрацию наоборот. Таким образом, вы должны объявить, что хотите использовать службу «speciel» при регистрации OracleController, а не при регистрации IFoo.

 containerBuilder.RegisterType<Foo1>().As<IFoo>();
containerBuilder.RegisterType<Foo2>().Named<IFoo>("oracle");
containerBuilder.RegisterType<OracleController>().WithParameter(ResolvedParameter.ForNamed<IFoo>("oracle"));
  

Именованная регистрация «oracle» гарантирует, что экземпляром IFoo по умолчанию будет Foo1, и вы получите Foo2 только при явном запросе его по имени.

Комментарии:

1. Как вы упомянули, это не полный эквивалент. Это работает, только если у вас есть возможность изменить регистрацию OracleController. Но функция Ninject WhenInjectedInto может переопределять привязку параметров без изменения исходной регистрации. Итак, что мне делать, если мне действительно нужен этот случай?