Autofac эквивалент Ninject's WhenInjectedInto () - PullRequest
20 голосов
/ 05 октября 2011

Итак, мы работаем над преобразованием некоторых работающих проектов из 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 Ответ

23 голосов
/ 05 октября 2011

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

...