1. 程式人生 > 其它 >解決.net core有迴圈依賴時注入的問題

解決.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