N 层解决方案上的依赖注入 - 删除样板文件

问题描述 投票:0回答:1

我正在创建一个具有 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 时遇到了问题,特别是在我工作中做的项目中。

c# dependency-injection n-tier-architecture
1个回答
0
投票

为什么不直接这样注射

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>();
© www.soinside.com 2019 - 2024. All rights reserved.