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