.net core DI 注册 Lazy<> 类型

    当我们在 .net core (2.1) 中运行如下代码注入 Lazy<T> 变量的时候:

public AccountService(Lazy<IHttpContextAccessor> httpContextAccessor)
{
}

 

    可能会遇到这样的错误提示:

InvalidOperationException: Unable to resolve service for type 'System.Lazy`1[Microsoft.AspNetCore.Http.IHttpContextAccessor]' while attempting to activate 'Senparc.Service.AccountService'.

 

    原因在于系统没有办法识别 Lazy<T> 类型的依赖注入条件,我们可以在 Startup.cs 中的 public void ConfigureServices(IServiceCollection services) 方法中加入如下粗体代码使之生效:

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc();//默认会有
            services.AddTransient(typeof(Lazy<>));//注册Lazy
        }

 

    Lazy<T> 是一个非常好的延迟加载的特性,可以在使用到该变量的时候才真正进行参数实例化和一系列控制反转的操作。因为通常我们某一个Service中可能只有一部分的方法需要用到某个变量,但是这个变量又需要在构造函数中依赖注入,此时 Lazy<T> 将帮助提升效率。

 

posted on 2018-05-03 14:17  SZW  阅读(1244)  评论(0编辑  收藏  举报