今天在是用abp vnext的自动控制器是碰见了个比较坑的地方 报错如下
意思是.net abp 框架依赖注入不能2个service 互相引用
我的"Appservice测试A"里注入了"Appservice测试B",“Appservice测试B"里边又注入了C,C里边又注入了"A”,通过构造函数的依赖注入都会新建对象
这样是不允许的,会造成死循环,因为A调用B生成B对象 B又去调用C 生成C对象 C里边注入了A A又创建了B,service之间不能相互调用后再注入。也就是说A注入了B B就不能再注入A
解决办法:
循环引用和Abp框架没啥关系,只要两个模块存在互相引用都会出问题,想要解决这个问题,办法就是引入第三者协调,在Abp中,AService和BService互相引用,那么可以通过底层的IServiceProvider来协调,即两个Service注入IServiceProvider 或者 ILazyAbpServiceProvider ,然后通过 service.GetRequiredService(),service.GetRequiredService() 的方式来解耦AB的循环依赖
其实这种方式就是不通过注入了 手动创建对象,如果构造函数没有注入一些其他东西 可以直接new 但如果构造函数有一些其他东西注入就要使用IServiceProvider。
using Microsoft.Extensions.DependencyInjection;
namespace Test
{
public class AService
{
private readonly IServiceProvider _service;
public AppService(
IServiceProvider service)
{
_service = service;
}
[Route("api/get")]
public async Task<dynamic> GetBasicInfo(string a)
{
try
{
var _Bservice = _service.GetRequiredService<BService>();//获取Bservice
List<int> id = await _Bservice.GetListIds();//调用Bservice中的方法
return id;
}
catch (Exception e)
{
throw new UserFriendlyException(e.Message);
}
}