Asp.net mvc 4 如何将依赖项注入到非控制器类中?

Asp.net mvc 4 如何将依赖项注入到非控制器类中?,asp.net-mvc-4,castle-windsor,Asp.net Mvc 4,Castle Windsor,我想对我的应用程序进行一些设置(初始化)。我在Global.asax.cs中执行此操作 我需要一个依赖项(可能是一个存储库)来实现我的目标 如何注入IFooRepository的实现? public class MvcApplication : HttpApplication { private static IFooRepository _fooRepository; protected void Application_Start() { // .

我想对我的应用程序进行一些设置(初始化)。我在
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());
    }
}
公共类存储安装程序:IWindsorInstaller
{
void IWindsorInstaller.安装(Castle.Windsor.IWindsorContainer,
Castle.MicroKernel.subsystem.Configuration.IConfigurationStore(存储)
{
container.AddFacility();
集装箱。登记(
用于()的组件
.由()实施
.生活方式,
组件.For().AsFactory());
container.Register(Classes.fromthissembly())
.BasedOn()
.WithServiceDefaultiInterfaces()
.生活方式(暂时的);
}
}
如何将依赖项注入未构造的对象(静态类)?

public class MvcApplication : HttpApplication
{

    private static IFooRepository _fooRepository;

    protected void Application_Start()
    {
        // ...

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

}
我通读了这本书,但不明白


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

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

public class MvcApplication : HttpApplication
{

    private static IFooRepository _fooRepository;

    protected void Application_Start()
    {
        // ...

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

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


但是请注意,当您将其注册为singleton时,应该只将其存储在静态字段中。否则,您将(意外地)将
IFooRepository
升级到singleton,这可能会导致各种问题(例如并发冲突或缓存问题)。

如果我的依赖项解析(Castle Windsor)位于另一个项目中,而我无法从UI访问它,该怎么办?这种情况不太可能发生。容器的配置必须从应用程序的启动路径(也称为)触发,使用MVC,此启动路径就是您的
MVCAPApplication
。这就是我的情况:\n我想要的是可能的吗?要么获取容器的引用并向容器请求实例,要么添加
GetFooRepository()使用容器的库中的
方法,并从您的
mvcapapplication
+1中调用它,并接受它,因为它回答了问题并且很有洞察力。