背景:我们之前是第一次做微服务所以一开始拆得很细,后面发现拆得不合理然后进行合并,合并的时候发现一个问题,比如有A服务有一个方法Run()这个方法执行完之后需要通知服务B,服务B执行结束之后还需要调用服务A的其他方法,一开始是网络请求所以没有问题,合并服务之后就发现问题了,A服务需要注入B服务,B服务又需要注入A服务,启动直接报错

解决:

方案1:循环依赖的服务不直接注入,而是改成用到的地方从容器中获取

public class OrderInfoService
 {
        private IServiceProvider _serviceProvider;
        public OrderInfoService(IServiceProvider serviceProvider)
        {
            _serviceProvider = serviceProvider;
        }
        public string GetOrderNo()
        {
            UserInfoService userInfoService = _serviceProvider.GetService<UserInfoService>();
            return userInfoService.GenUserNo();
        }
    }

方案2:使用Lazy延时加载,注入时注入延迟加载的版本比如

public class OrderInfoService
    {
        private Lazy<UserInfoService> _userInfoService;
        public OrderInfoService(Lazy<UserInfoService> userInfoService)
        {
            _userInfoService = userInfoService;
        }
        public string GetOrderNo()
        {
            return _userInfoService.Value.GenUserNo();
        }
    }

此方式需要注入

services.AddTransient(typeof(Lazy<>), typeof(Lazier<>));
internal class Lazier<T> : Lazy<T> where T : class
{
    public Lazier(IServiceProvider provider)
        : base(() => provider.GetRequiredService<T>())
    {

    }
}


参考链接:https://stackoverflow.com/questions/44934511/does-net-core-dependency-injection-support-lazyt