一种更好的注入东西的方法
·
2 分钟阅读
Available in:
中文
·
English
·
Español
·
Français
·
Deutsch
·
Português
·
한국어
·
日本語
·
Русский
·
العربية
·
हिन्दी
·
Polski
·
Türkçe
·
Bahasa Indonesia
·
Nederlands
每当我构建服务、存储库、属性或任何要注入到我的应用程序中的内容时,我们都必须执行此步骤,这实际上是将服务添加到应用程序中。
这始终是相同的,您转到 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,它有一个名为 AddServices 的 static 方法,该方法返回 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();
这看起来干净多了,不是吗?好了,我们已经成功地注入了一些服务和存储库,但现在看起来更好了,我们实际上已经在外部库中注入了我们注入的内容。