Подтвердить что ты не робот

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

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

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

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

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

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

4b9b3361

Ответ 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 только при явном запросе его по имени.