我正在我的Web应用程序中尝试IoC,并希望根据最佳实践做事。最近我发现了一个名为DryIoc的IoC框架,它应该是小而快的。
我已经阅读了这些示例,但似乎没有人指出我应该把容器放在哪里。
它应该驻留在控制器中吗?还是在Global.asax?别的地方可能吗?或者可能作为类中的静态变量?
我很感激,如果有人能够指导我朝着正确的方向前进,最好还是使用一些示例代码,因为我已经停滞不前,并且不知道如何继续。
var container = new Container(); // Should obviously NOT be a local variable
container.Register<ISalesAgentRepository, SalesAgentRepository>(Reuse.Singleton);
答案 0 :(得分:2)
通常我会做以下事情:
1 - 创建一个bootstrapper类
public static class Bootstrapper {
public static Container _container;
public void Bootstrap() {
var container = new Container;
// TODO: Register all types
_container = container;
}
public static T GetInstance<T>() {
return _container.Resolve<T>();
}
}
2 - 在Application_Start方法中调用global.asax中的bootstrap方法:
protected void Application_Start() {
Bootstrapper.Bootstrap();
}
永远不要直接在任何地方使用容器,你必须在MVC生命周期的某个地方挂钩,通常你使用的DI包可以为你做这个。
另请注意,我已经在bootstrapper类中添加了GetInstance<T>
方法。此方法可以通过请求类型实例直接使用容器。我已经添加了这个方法,因此您知道它是可能的,但是如果可能的话总是使用构造函数注入。
答案 1 :(得分:1)
实际上,您可能不需要将容器存放在您身边。这是DryIoc WebApi Owin sample。
DryIoc.WebApi扩展将在IDependencyResolver实现中适当时存储和处置容器。