Microsoft.Extensions.DependencyInjection 在 C# 中的应用

引言

Microsoft.Extensions.DependencyInjection 是 .NET Core 框架内置的一个依赖注入(Dependency Injection,简称DI)库,它为开发者提供了一种灵活的方式来管理应用程序中的依赖关系。依赖注入是一种设计模式,旨在降低组件之间的耦合度,提高代码的可测试性和可维护性。本文将详细介绍 Microsoft.Extensions.DependencyInjection 的基本用法,并通过代码示例来展示如何在 C# 项目中应用它。

安装与基本使用

安装

要使用 Microsoft.Extensions.DependencyInjection,首先需要在你的项目中安装它。可以通过 NuGet 包管理器来安装。在 Visual Studio 中,你可以通过“管理 NuGet 包”搜索并安装 Microsoft.Extensions.DependencyInjection 包。

基本使用步骤

  1. 创建服务集合:首先,你需要创建一个 IServiceCollection 实例,用于注册服务。

  2. 注册服务:使用服务集合的 AddTransientAddScopedAddSingleton 方法来注册服务。这些方法决定了服务的生命周期。

  3. 构建服务提供者:通过调用服务集合的 BuildServiceProvider 方法来构建 IServiceProvider 实例,用于解析服务。

  4. 解析服务:通过服务提供者来解析并使用服务。

示例代码

以下是一个简单的示例,展示了如何使用 Microsoft.Extensions.DependencyInjection 来注册和使用服务。

定义接口与实现类
public interface IVehicle
{
    void Run();
}

public class Car : IVehicle
{
    public void Run()
    {
        Console.WriteLine("Car is running");
    }
}

public interface IWeapon
{
    void Fire();
}

public class Gun : IWeapon
{
    public void Fire()
    {
        Console.WriteLine("Bang!");
    }
}
注册并使用服务
using Microsoft.Extensions.DependencyInjection;
using System;

class Program
{
    static void Main(string[] args)
    {
        // 创建服务集合
        var services = new ServiceCollection();

        // 注册服务
        services.AddTransient<IVehicle, Car>();
        services.AddSingleton<IWeapon, Gun>();

        // 构建服务提供者
        var provider = services.BuildServiceProvider();

        // 解析服务
        var car = provider.GetService<IVehicle>();
        var gun = provider.GetService<IWeapon>();

        // 使用服务
        car.Run();
        gun.Fire();

        // 如果需要,可以解析并使用更多服务...
    }
}

生命周期

Microsoft.Extensions.DependencyInjection 提供了三种服务生命周期:

  • Transient(瞬时):每次请求都会创建一个新的实例。

  • Scoped(作用域):在同一个作用域内只创建一个实例,对于 Web 应用程序,作用域通常与请求相关联。

  • Singleton(单例):整个应用程序生命周期内只创建一个实例。

高级用法

Keyed 服务

当你有多个服务实现同一个接口时,可以使用 Keyed 服务来注册和解析特定的实现。

services.AddKeyedTransient<IVehicle, Car>("Car");
services.AddKeyedTransient<IVehicle, Truck>("Truck");

// 解析特定的实现
var car = provider.GetKeyedService<IVehicle>("Car");

使用 ActivatorUtilities

ActivatorUtilities 提供了一种灵活的方式来创建和解析依赖项,即使它们没有被显式注册到服务容器中。

public class Driver
{
    private readonly IVehicle _vehicle;

    public Driver(IVehicle vehicle)
    {
        _vehicle = vehicle;
    }

    public void Drive()
    {
        _vehicle.Run();
    }
}

// 使用 ActivatorUtilities 创建 Driver 实例
var driver = ActivatorUtilities.CreateInstance<Driver>(provider, provider.GetService<Car>());
driver.Drive();

结论

Microsoft.Extensions.DependencyInjection 为 C# 开发者提供了一种强大而灵活的方式来管理应用程序中的依赖关系。通过依赖注入,我们可以降低组件之间的耦合度,提高代码的可测试性和可维护性。希望本文的介绍和示例代码能够帮助你更好地理解和应用 Microsoft.Extensions.DependencyInjection

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值