0

我想对我的应用程序进行一些设置(初始化)。我在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());
    }
}

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

我已经阅读了基于接口的工厂的文档,但我不明白。

什么是设施?它们是用来做什么的?

4

1 回答 1

1

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

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

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

于 2013-07-24T12:12:16.123 回答