.net核心依赖注入是否支持Lazy <T>

ATe*_*rry 20 c# dependency-injection lazy-initialization .net-core asp.net-core

我试图使用通用的Lazy类来实例化.net核心依赖注入扩展的昂贵类.我已经注册了IRepo类型,但我不确定Lazy类的注册是什么样的,或者它是否支持.作为一种解决方法,我使用了这种方法http://mark-dot-net.blogspot.com/2009/08/lazy-loading-of-dependencies-in-unity.html

配置:

public void ConfigureService(IServiceCollection services)
{
    services.AddTransient<IRepo, Repo>();
    //register lazy
}
Run Code Online (Sandbox Code Playgroud)

控制器:

public class ValuesController : Controller 
{
    private Lazy<IRepo> _repo;

    public ValuesController (Lazy<IRepo> repo)
    {
        _repo = repo;
    }

    [HttpGet()]
    public IActionResult Get()
    {
         //Do something cheap
         if(something)
             return Ok(something);
         else
             return Ok(repo.Value.Get());
    }
}
Run Code Online (Sandbox Code Playgroud)

Mic*_*ito 39

这是另一种支持通用注册的方法,Lazy<T>以便可以懒惰地解决任何类型.

services.AddTransient(typeof(Lazy<>), typeof(Lazier<>));

internal class Lazier<T> : Lazy<T> where T : class
{
    public Lazier(IServiceProvider provider)
        : base(() => provider.GetRequiredService<T>())
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @Akash请展示如何"轻松"编写一个"更轻"的"Lazy <T>"类,该类具有线程安全性并完成其工作以及内置类型.我认为可以说"Lazy <T>"在99.9%的用例中运行良好. (19认同)
  • 这是一个很好的解决方案,直到有人写了 `Laziest&lt;T&gt;` (3认同)
  • 你可以编写自己的,但这是一个简洁的解决方案.我的假设是,T的昂贵初始化超过了与Lazy相关的任何成本. (2认同)
  • @JeremyLakeman 你能发布一个专门的答案并详细说明吗? (2认同)

Sco*_*ain 12

您只需要为创建Lazy<IRepo>对象的工厂方法添加注册.

public void ConfigureService(IServiceCollection services)
{
    services.AddTransient<IRepo, Repo>();
    services.AddTransient<Lazy<IRepo>>(provider => new Lazy<IRepo>(provider.GetService<IRepo>));
}
Run Code Online (Sandbox Code Playgroud)

  • 您可以自己编写一个通用的辅助方法。 (2认同)