【问题标题】:Autofac equivalent of Ninject's WhenInjectedInto()Autofac 相当于 Ninject 的 WhenInjectedInto()
【发布时间】:2011-10-05 17:00:18
【问题描述】:

因此,我们正在努力将工作中的一些项目从 Ninject 转换为 Autofac,并且我们偶然发现了 Ninject 中一些非常简洁的东西,我们无法弄清楚如何在 Autofac 中进行操作。在我们的应用程序中,我们有一个名为ISession 的接口,它以两种不同的具体类型实现。一个用于 Oracle 数据库,另一个用于 MS-SQL 数据库。

我们的 MVC 应用程序中有控制器,它们只需要 ISession 的一个具体实现,具体取决于它们被注入到哪个控制器中。例如:

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

我的问题是:我们如何在 Autofac 中获得相同的结果?当IFoo被注入任何控制器时,Foo1应该默认提供,但是在一种特殊情况下,我们需要Foo2来代替。

提前感谢您的帮助!

【问题讨论】:

    标签: asp.net-mvc-3 dependency-injection inversion-of-control ninject autofac


    【解决方案1】:

    使用 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。

    【讨论】:

    • 正如你所提到的,这不是完全等价的。这仅在您可以更改 OracleController 注册时才有效。但是 Ninject 的 WhenInjectedInto 可以覆盖参数绑定而不修改原来的注册。那么如果真的需要这种情况该怎么办呢?
    猜你喜欢
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-07
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多