如何将依赖注入非Controller类?

时间:2013-07-24 11:56:42

标签: asp.net-mvc-4 castle-windsor

我想做一些我的应用程序设置(初始化)。我在Global.asax.cs中执行此操作。

我将需要一个依赖(可能是一个存储库)来实现我的目标。

如何注入IFooRepository的实施?

public class MvcApplication : HttpApplication
{

    private static IFooRepository _fooRepository;

    protected void Application_Start()
    {
        // ...

        IFoo foo = _fooRepository.Get(0);
        foo.DoSomething();
    }

}

我尝试了这个,但失败了:

public class RepositoriesInstaller : IWindsorInstaller
{
    void IWindsorInstaller.Install(Castle.Windsor.IWindsorContainer container,
        Castle.MicroKernel.SubSystems.Configuration.IConfigurationStore store)
    {
        container.AddFacility<TypedFactoryFacility>();

        container.Register(
            Component.For<IFoo>()
            .ImplementedBy<Foo>()
            .LifestyleTransient(),
            Component.For<IFooRepository>().AsFactory());

        container.Register(Classes.FromThisAssembly()
            .BasedOn<IFooRepository>()
            .WithServiceDefaultInterfaces()
            .LifestyleTransient());
    }
}

如何将依赖项注入未构造的东西(静态类)?

我已阅读documentation for interface-based factories,但我不明白。

什么是设施?它们用于什么?

1 个答案:

答案 0 :(得分:1)

由于MvcApplication是通常会触发应用程序初始化和所有组件注册的类,因此您不能让DI容器将依赖项注入其中。除此之外,容器没有内置支持注入静态依赖项,因为在依赖注入的上下文中,注入静态的有用性相当有限。

但解决方案实际上非常简单:在配置完成后,您应该从容器中解析IFooRepository

请注意,您只应在将IFooRepository注册为单身时将其存储在静态字段中。否则你会(意外地)将IFooRepository提升为单例,这可能会导致各种麻烦(例如并发冲突或缓存问题)。