我正在尝试使用通用的Lazy类来实例化具有.net核心依赖项注入(inject)扩展的昂贵类。我已经注册了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
}

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

最佳答案

这是另一种支持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>())
    {
    }
}

关于c# - .net核心依赖项注入(inject)是否支持Lazy <T>,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44934511/

10-14 20:41