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中调用它,并接受它,因为它回答了问题并且很有洞察力。