我正在创建一个具有 API (Microsoft.NET.Sdk.Web)、域 (Microsoft.NET.Sdk) 和面向 .NET 8 的 MVC 项目 (Microsoft.NET.Sdk.Web) 的解决方案。
在我的域中,我有两个类,如下所示:
public class ApplicationUserQuery
{
private readonly string _connectionString;
public ApplicationUserQuery(string connectionString)
{
_connectionString = connectionString;
}
// ...
}
public class ApplicationUserService
{
private readonly ApplicationUserQuery _applicationUserQuery;
public ApplicationUserService(ApplicationUserQuery applicationUserQuery)
{
_applicationUserQuery = applicationUserQuery;
}
// ...
}
要在我的 API 项目中使用这些类,我在 Program.cs 中执行以下操作:
var applicationDatabaseConnectionString = builder.Configuration.GetConnectionString("ApplicationDatabase");
if (applicationDatabaseConnectionString == null)
{
throw new ArgumentNullException(nameof(applicationDatabaseConnectionString));
}
builder.Services.AddScoped(_ => new ApplicationUserQuery(applicationDatabaseConnectionString));
builder.Services.AddScoped<ApplicationUserService>();
这可行,但似乎有很多样板仅适用于两个类,并且对于我在域中创建的每个服务/查询类来说,这些样板将继续增长。有没有办法使用内置的 .NET 核心内容来简化这个过程?我想避免使用像 Ninject 这样的第三方库,因为我在使用 Ninject 时遇到了问题,特别是在我工作中做的项目中。
为什么不直接这样注射
IConfiguration
public class ApplicationUserQuery
{
private readonly string _connectionString;
public ApplicationUserQuery(IConfiguration config)
{
_connectionString = config["ApplicationDatabase"];
// do you really need this checking?
// just make an extension method in program.cs for any null config valules
// checks if you really need to.
if(string.isNullOrWhiteSpace(_connectionString) {//throw exception}
}
}
然后在Program.cs中
builder.Services.AddScoped<ApplicationUserQuery>();
builder.Services.AddScoped<ApplicationUserService>();