C# 语言 如何使用 Microsoft.Extensions.DependencyInjection

C#阿木 发布于 2025-06-13 8 次阅读


使用 Microsoft.Extensions.DependencyInjection 在 C 中的实践与应用

在 C 开发中,依赖注入(Dependency Injection,简称 DI)是一种常用的设计模式,它能够帮助我们更好地管理对象之间的依赖关系,提高代码的可维护性和可测试性。Microsoft.Extensions.DependencyInjection 是 .NET Core 和 .NET 5/6/7 等框架中提供的一个轻量级的依赖注入容器,它可以帮助开发者轻松地实现依赖注入。

本文将围绕 Microsoft.Extensions.DependencyInjection,详细介绍其在 C 中的使用方法、实践案例以及应用场景。

一、依赖注入简介

依赖注入是一种设计模式,它允许我们将依赖关系从类中分离出来,通过外部容器来管理这些依赖关系。在依赖注入中,有三个主要角色:

1. 依赖(Dependent):需要依赖其他对象来完成某些功能的类。
2. 依赖项(Dependency):被依赖项所依赖的对象。
3. 容器(Container):负责创建对象实例,并注入依赖项到依赖中。

二、Microsoft.Extensions.DependencyInjection 简介

Microsoft.Extensions.DependencyInjection 是 .NET 框架提供的一个轻量级的依赖注入容器,它支持构造函数注入、属性注入和接口注入等多种注入方式。以下是一些关键特性:

1. 支持多种注入方式:构造函数注入、属性注入、方法注入等。
2. 支持多种服务生命周期:单例、实例、作用域等。
3. 支持服务定位器模式:通过接口或类型查找服务实例。
4. 支持中间件和过滤器:用于处理请求和响应。

三、在 C 中使用 Microsoft.Extensions.DependencyInjection

1. 创建依赖注入容器

我们需要创建一个依赖注入容器。在 .NET Core 和 .NET 5/6/7 中,我们可以使用 `IHostBuilder` 来创建一个容器。

csharp
var host = new HostBuilder()
.ConfigureServices((hostContext, services) =>
{
// 注册服务
services.AddSingleton();
})
.Build();

await host.RunAsync();

在上面的代码中,我们创建了一个 `HostBuilder` 实例,并配置了 `ConfigureServices` 方法来注册服务。

2. 注册服务

在 `ConfigureServices` 方法中,我们可以使用 `services.AddSingleton`、`services.AddScoped`、`services.AddTransient` 等方法来注册服务。

- `AddSingleton`:创建一个单例服务,整个应用程序中只有一个实例。
- `AddScoped`:创建一个作用域服务,每个请求或操作都会创建一个新的实例。
- `AddTransient`:创建一个瞬态服务,每次请求都会创建一个新的实例。

以下是一个注册服务的示例:

csharp
services.AddSingleton();
services.AddScoped();
services.AddTransient();

3. 解析服务

在应用程序中,我们可以通过 `IServiceProvider` 接口来解析服务。

csharp
public class Program
{
public static async Task Main(string[] args)
{
var host = new HostBuilder()
.ConfigureServices((hostContext, services) =>
{
// 注册服务
services.AddSingleton();
})
.Build();

await host.RunAsync();

// 解析服务
var myService = host.Services.GetService();
var myScopedService = host.Services.GetService();
var myTransientService = host.Services.GetService();

// 使用服务
myService.DoSomething();
myScopedService.DoSomething();
myTransientService.DoSomething();
}
}

在上面的代码中,我们通过 `GetService` 方法解析了三种不同生命周期的服务,并调用了它们的方法。

4. 依赖注入中间件

在 ASP.NET Core 应用程序中,我们可以使用依赖注入来注册中间件。

csharp
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();

// 注册中间件
services.AddTransient();
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}

// 使用中间件
app.UseMiddleware();
}

在上面的代码中,我们注册了一个名为 `MyMiddleware` 的中间件,并在 `Configure` 方法中使用它。

四、实践案例

以下是一个简单的依赖注入案例,演示了如何使用 Microsoft.Extensions.DependencyInjection 来管理服务依赖。

csharp
public interface ICalculator
{
int Add(int a, int b);
}

public class Calculator : ICalculator
{
private readonly IMyService _myService;

public Calculator(IMyService myService)
{
_myService = myService;
}

public int Add(int a, int b)
{
return a + b + _myService.Value;
}
}

public interface IMyService
{
int Value { get; }
}

public class MyService : IMyService
{
public int Value => 10;
}

public class Program
{
public static async Task Main(string[] args)
{
var host = new HostBuilder()
.ConfigureServices((hostContext, services) =>
{
// 注册服务
services.AddSingleton();
services.AddScoped();
})
.Build();

await host.RunAsync();

// 解析服务
var calculator = host.Services.GetService();
var result = calculator.Add(5, 3);
Console.WriteLine($"Result: {result}");
}
}

在这个案例中,我们创建了一个 `ICalculator` 接口和一个实现该接口的 `Calculator` 类。`Calculator` 类依赖于 `IMyService` 接口,我们通过依赖注入将 `MyService` 实例注入到 `Calculator` 类中。在 `Main` 方法中,我们解析了 `ICalculator` 服务,并调用了它的 `Add` 方法。

五、总结

Microsoft.Extensions.DependencyInjection 是 .NET 框架中一个强大的依赖注入容器,它可以帮助我们更好地管理对象之间的依赖关系。相信你已经了解了如何在 C 中使用 Microsoft.Extensions.DependencyInjection,以及它在实际开发中的应用。

在实际项目中,合理地使用依赖注入可以提高代码的可维护性和可测试性,使我们的应用程序更加健壮和灵活。希望本文能对你有所帮助。