如何解决局部类中的依赖注入
我们正在使用.NET Core 3.1
。我们想使用部分类将服务实现拆分为多个文件。代码如下:
IAccountsService.cs
public interface IAccountsService
{
AppUser Get(string username);
bool HasRole(string username,int roleId);
// ...
}
AccountsService.cs
public partial class AccountsService : IAccountsService
{
private readonly MyDbContext _dbContext;
public AccountsService(MyDbContext dbContext)
{
_dbContext = dbContext;
}
public AppUser Get(string username)
{
return _dbContext.AppUser.FirstOrDefault(x => x.Username == username);
}
}
AccountsService.Roles.cs
public partial class AccountsService : IAccountsService
{
public bool HasRole(string username,int roleId)
{
// _dbContext is null here!
}
}
AccountsController.cs
private readonly IAccountsService _accountsService;
public AccountsController(IAccountsService accountsService)
{
_accountsService = accountsService;
}
[HttpGet]
public IActionResult Test1()
{
// _dbContext is NOT null
return Ok(_accountsService.Get("admin",1));
}
[HttpGet]
public IActionResult Test2()
{
// _dbContext is null
return Ok(_accountsService.HasRole("admin",1));
}
我观察到,当我呼叫Test1
(呼叫Get(string username)
)时,_dbContext
不是null
。但是,当我呼叫Test2
(呼叫HasRole(string username,int roleId)
)时,_dbContext
是null
。调用Test2
时,永远不会命中AccountsService.cs
中的构造函数。
解决方法
正如评论中的人们所述:“ partial
是编译时功能,DI是运行时。”是编译器将这两个类放在一起,因此,如果在调用_dbContext
期间看到HasRole
为空,则可能意味着以下几点:
- 使用
AccountsService(MyDbContext dbContext)
参数调用null
构造函数。正如您所说的,Test2
中的构造函数“从不击中”,这个选项似乎被证明是错误的。 - 有一个不同的构造函数(例如默认ctor)被调用。如果您有不知道的第三部分类,可能就是这种情况。
- C#编译器不会将这两个部分合并为一个CLR类型,如果它们都具有不同的名称空间或不同的程序集,则会发生这种情况。在这种情况下,C#会为“角色”类型生成一个默认的构造函数,该构造函数将由DI容器调用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。