一种更好的注入东西的方法

· 2 分钟阅读

每当我构建服务、存储库、属性或任何要注入到我的应用程序中的内容时,我们都必须执行此步骤,这实际上是将服务添加到应用程序中。

这始终是相同的,您转到 Program.cs,然后继续在文件的某些部分添加 builder.Services.AddScoped<MyService>(); 以注入服务。

像这样的东西:

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();

// Repositories
builder.Services.AddScoped<ARepository>(); // 👀
builder.Services.AddScoped<BRepository>(); // 👀

// Services
builder.Services.AddScoped<AService>(); // 👀
builder.Services.AddScoped<BService>(); // 👀
builder.Services.AddScoped<CService>(); // 👀
builder.Services.AddScoped<DService>(); // 👀

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

我的意思是,它确实有效,但我很挑剔,而且我不太喜欢它。

假设我们想要执行多个依赖项注入,并且它们实际上并不是相同的东西,在我的例子中,这可能类似于拥有一个包含所有存储库的库,另一个包含所有服务的库,最后一个包含属性的库。

在这种情况下,您能想象我们必须添加到 Program.cs 中的行数吗?

假设我们有一个包含一些服务的库,如果我们想包含所有服务,我们必须使用 IServiceCollection

因此,我们将创建一个 static class,它有一个名为 AddServicesstatic 方法,该方法返回 IServiceCollection

在本例中,它将被命名为 IServiceCollectionServicesExtensions

/// <summary>
/// IServiceCollectionServicesExtensions class
/// </summary>
public static class IServiceCollectionServicesExtensions
{
    /// <summary>
    /// AddCoreServices
    /// </summary>
    /// <param cref="IServiceCollection" name="services">Parameter for <see cref="IServiceCollection"/></param>
    /// <returns>An object of type <see cref="IServiceCollection"/></returns>
    public static IServiceCollection AddServices(this IServiceCollection services)
    {
        services
            .AddScoped<AService>()
            .AddScoped<BService>()
            .AddScoped<CService>()
            .AddScoped<DService>();

        return services;
    }
}

不仅如此,我们还有另一个库,其中包含该服务正在使用的一些存储库,所以让我们也这样做。

/// <summary>
/// IServiceCollectionServicesExtensions class
/// </summary>
public static class IServiceCollectionServicesExtensions
{
    /// <summary>
    /// AddCoreServices
    /// </summary>
    /// <param cref="IServiceCollection" name="services">Parameter for <see cref="IServiceCollection"/></param>
    /// <returns>An object of type <see cref="IServiceCollection"/></returns>
    public static IServiceCollection AddRepositories(this IServiceCollection services)
    {
        services
            .AddScoped<ARepository>()
            .AddScoped<BRepository>();

        return services;
    }
}

现在,我们已经创建了要注入的存储库和服务方法,但是我们如何使用它们呢?

让我们回到 Program.cs 并添加以下内容:

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();

// Repositories
builder.Services.AddRepositories(); // 👀

// Services
builder.Services.AddServices(); // 👀

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

这看起来干净多了,不是吗?好了,我们已经成功地注入了一些服务和存储库,但现在看起来更好了,我们实际上已经在外部库中注入了我们注入的内容。