所以我们正在努力将一些项目从Ninject转换到Autofac,我们偶然发现了一些在Ninject中非常整洁的东西,我们不知道如何在Autofac中做到这一点。在我们的应用程序中,我们有一个名为ISession
的接口,它以两种不同的具体类型实现。一个连接到Oracle数据库,另一个连接到MS-SQL数据库。
我们的MVC应用程序中有一些控制器,它们只需要一个具体的ISession实现,这取决于它们被注入到哪个控制器中。例如:
Bind<IFoo>().To<Foo1>();
Bind<IFoo>().To<Foo2>().WhenInjectedInto<OracleController>();
我的问题是:我们如何在Autofac中实现相同的结果?当IFoo
注入到任何控制器中时,默认情况下应该提供Foo1
,但是在一种特殊情况下,我们需要Foo2
。
提前感谢大家的帮助!
发布于 2011-10-06 02:47:45
使用Autofac,您可以通过相反的方式完成注册。因此,您应该在注册OracleController时声明要使用"speciel“服务,而不是在注册IFoo时声明。
containerBuilder.RegisterType<Foo1>().As<IFoo>();
containerBuilder.RegisterType<Foo2>().Named<IFoo>("oracle");
containerBuilder.RegisterType<OracleController>().WithParameter(ResolvedParameter.ForNamed<IFoo>("oracle"));
命名注册"oracle“确保默认的IFoo实例为Foo1,并且只有当您显式地按名称请求它时,才会获得Foo2。
https://stackoverflow.com/questions/7664912
复制相似问题