C# 如何在mvc控制器中延迟注入服务的执行

C# 如何在mvc控制器中延迟注入服务的执行,c#,.net,asp.net-mvc,dependency-injection,C#,.net,Asp.net Mvc,Dependency Injection,考虑这样一种情况:您有一个控制器,它使用一些服务,这些服务是由一些IOC容器(如或)注入的。每次请求到达该控制器时,服务都会初始化,即使它只是想触发只调用视图的简单操作。这里的问题是,如何将服务的初始化推迟到真正需要的时候,以便节省一些资源。我应该在这里用吗?或者我是否应该将此服务注入方法而不是控制器 例如: public class SomeController : Controller { private readonly ISomeService _service; pu

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

例如:

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();
    }
}

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


具体来说,我认为这是内置于autofac中的,可以使用模块添加到ninject中。是的,大多数体面的IoC容器允许您注入
Lazy
,并延迟初始化,直到使用Lazy对象。通常,如果将构造函数参数的类型从T更改为
Lazy


具体来说,我相信这是内置于autofac中的,并且可以使用模块添加到ninject中

只需几点想法!。类(在本例中为控制器)的构造函数,在解析控制器时必须解析其依赖项

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


如果你的被注入对象的创建是昂贵的(我倾向于保持它的简单性,因为在初始化过程中不需要太多逻辑),那么有一件事要考虑的是对对象有一个单独的或每个请求生命周期的范围(如果可能的话)

只是一些想法!类(在本例中为控制器)的构造函数,在解析控制器时必须解析其依赖项

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


如果你的被注入对象的创建是昂贵的(我倾向于保持它的简单性,因为在初始化过程中不需要太多逻辑),那么需要考虑的是,对于对象(如果可能的话)有一个单独的或每个请求生命周期的范围(如果可能的话)

你可以实现属性注入,所以它将在吸气剂时被注入。(到服务)是第一次调用。您是否运行了性能测试以查看差异以及这是否对您的应用程序有实际意义?为什么对
Lazy
的引用比对
T
的引用存储得更快?您可以实现属性注入,因此当getter(对服务)是第一次调用。您是否运行了性能测试以查看差异是什么以及这是否对您的应用程序有实际意义?为什么对
Lazy
的引用比对
T
的引用存储得更快?我已经做了一些进一步的研究,我认为很少使用Lazy的每个请求实例配置是正确的很好。我接受了你的答案,谢谢。我已经做了一些进一步的研究,我认为每个请求配置实例很少使用Lazy是可以的。我接受了你的答案,谢谢