解决.net core有循环依赖时注入的问题
作者:互联网
背景:我们之前是第一次做微服务所以一开始拆得很细,后面发现拆得不合理然后进行合并,合并的时候发现一个问题,比如有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
标签:core,Lazy,依赖,服务,serviceProvider,OrderInfoService,userInfoService,net,public 来源: https://www.cnblogs.com/suxian/p/16301841.html