我想做一些我的应用程序设置(初始化)。我在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,但我不明白。
什么是设施?它们用于什么?
答案 0 :(得分:1)
由于MvcApplication
是通常会触发应用程序初始化和所有组件注册的类,因此您不能让DI容器将依赖项注入其中。除此之外,容器没有内置支持注入静态依赖项,因为在依赖注入的上下文中,注入静态的有用性相当有限。
但解决方案实际上非常简单:在配置完成后,您应该从容器中解析IFooRepository
。
请注意,您只应在将IFooRepository
注册为单身时将其存储在静态字段中。否则你会(意外地)将IFooRepository
提升为单例,这可能会导致各种麻烦(例如并发冲突或缓存问题)。