关于.Net Core原生IOC生命周期嵌套报错

最近有群友发现一个神奇的现象 当使用生命周期嵌套会出现报错问题,究竟是什么情景会出现该问题呢!

创建两个实现类IocService1 ->接口IIocService1 ,IocService2 ->接口IIocService2

然后在IocService2 中注入IocService1 代码如下:

namespace WebApplication1.Services
{
    public class IocService2 : IIocService2
    {
        public IIocService1 _iocService1;

        public IocService2(IIocService1 iocService1)
        {
            _iocService1 = iocService1;
        }
    }

    public interface IIocService2
    {
    }
}

注册生命周期如下,会出现报错。

builder.Services.AddScoped<IIocService1, IocService1>();
builder.Services.AddSingleton<IIocService2, IocService2>();

大致原因是因为Singleton与Scoped创建的服务容器不一致导致的,在项目中也因该减少使用Scoped,很容易出现该错误!

该图可以大致说明报错原因:

 当服务为Scope时不能从跟容器获取,因该从子容器获取

           // 根容器
            _serviceProvider = serviceProvider;
            // 子容器
            var pro = _serviceProvider.CreateScope().ServiceProvider;
            // Scope的服务必须从子容器获取,不能从根容器获取
            var service1 = _serviceProvider.CreateScope().ServiceProvider.GetService<ITest1Service>();
            service1?.Say().Wait();

 

此文章仅是对自己学习进行记录,非专业解答,大神勿喷!

三更灯火五更鸡,正是男儿读书时!

posted @ 2022-03-15 01:24  含泪拒绝王阿姨i  阅读(184)  评论(0)    收藏  举报