【发布时间】:2020-08-25 08:45:50
【问题描述】:
我们正在使用.NET Core 3.1。我们想使用部分类将服务实现拆分为多个文件。代码如下所示:
IAAccountsService.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 产生任何影响。 -
AccountsService中有多个构造函数吗?您还应该像这样添加参数验证:this.dbContext == dbContext ?? throw new ArgumentNullException(nameof(dbContext));. -
partial是编译时特性,DI 是运行时特性。不能互相影响。 -
@Dai 是的,
AccountsService中确实有多个构造函数。我删除了它们,现在它可以工作了。 -
"我们希望使用部分类将服务实现拆分为多个文件。"在我看来,您的课程太大了,这会导致可维护性问题。将它们分成部分只会对您有所帮助。您可能在这里违反了单一职责原则。您可能想先解决根本问题。
标签: c# asp.net-core dependency-injection