【问题标题】:How to defer execution of injected services in mvc controllers [duplicate]如何在 mvc 控制器中推迟注入服务的执行 [重复]
【发布时间】:2017-03-06 10:49:04
【问题描述】:

考虑这样一种情况,您有一些控制器使用某些 IOC 容器注入的服务,例如 autofacninject。每次请求到达该控制器时都会初始化服务,即使它只是想触发仅调用视图的简单操作。这里的问题是如何将服务的初始化推迟到真正需要的时候,这样我就可以节省一些资源。我应该在这里使用Lazy吗?或者也许我应该将此服务注入方法而不是控制器?

例子:

public class SomeController : Controller
{
    private readonly ISomeService _service;

    public SomeController(ISomeService service)
    {
        this._service = service;
    }

    // action that completely doesn't need to initialize service
    public ActionResult Index()
    {
        return View();
    }
    // this action needs to initialize 
    public ActionResult Save()
    {
        this._service.DoSomething();
        return View();
    }
}

【问题讨论】:

  • 你可以实现属性注入,所以它会在第一次调用getter(到服务)时被注入。
  • 您是否进行了性能测试以查看差异是什么以及这对您的应用程序是否真正重要?
  • 为什么引用 Lazy<T> 比引用 T 更快?

标签: c# .net asp.net-mvc dependency-injection


【解决方案1】:

只是一些想法!您的类的构造函数(在本例中为控制器)should not do anything except store the dependencies,它必须在解析控制器时解决依赖关系。

当您使用任何 DI 框架时,容器需要预先了解依赖层次结构及其生命周期管理范围,以便在任何组件请求时,容器可以提供已解析的实例。 如果您担心性能方面的问题,可以使用更快的 DI 容器。

如果创建注入对象的成本很高(我倾向于保持简单,因为在初始化中不需要太多逻辑),那么需要考虑的一件事可能是对象的 Singleton 或 Per Request 生命周期范围(如果可能的话)

【讨论】:

  • 我已经做了一些进一步的研究,我认为每个请求配置的实例很少使用 Lazy 很好。我接受了你的回答,谢谢
【解决方案2】:

是的,大多数体面的 IoC 容器都允许您注入 Lazy<T> 并推迟初始化,直到使用惰性对象。通常,如果您将构造函数参数的类型从 T 更改为 Lazy<T>

,这将自动工作

具体来说,我相信这是autofac内置的,可以使用Ninject.Extensions.Factory模块添加到ninject

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-29
    • 1970-01-01
    • 2019-06-04
    • 1970-01-01
    相关资源
    最近更新 更多