美文网首页
C#之依赖注入

C#之依赖注入

作者: 小羊爱学习 | 来源:发表于2025-04-17 16:45 被阅读0次

基本概念

依赖注入(Dependency Injection,简称DI)是一种设计模式,用于实现控制反转(Inversion of Control,简称IoC)原则。依赖注入的主要目的是将对象的创建和对象之间的依赖关系的管理从对象内部转移到外部容器或框架中,从而提高代码的可维护性、可测试性和灵活性,依赖注入是针对项目级而不是功能级。

  • 依赖:一个类在执行其功能时需要的其他类或资源。
  • 注入:将依赖传递给类的过程,通常在类的构造函数、属性或方法中完成。

本文使用.net core的原生内置框架,主要是为了先去从源头先去弄清楚什么是依赖注入。

NuGet 包:

首先我们要去下载.NET Core内置的依赖注入框架Microsoft.Extensions.DependencyInjection,可以看到它会依赖Microsoft.Extensions.DependencyInjection.Abstractions,所以我们下载时也会自动帮我们安装Abstractions这个包。下载好后,我们就可以使用它提供的容器(ServiceCollection)进行服务注册了。

image.png
image.png

接口和实现

在依赖注入模式里,接口和实现最好是一一对应的,也就是一个接口对应一个实现,不要试图一对多。

  • 定义接口:
    public interface IEmailService
    {
        void SendEmail(string to, string body);
    }
  • 定义实现:
    public class EmailService : IEmailService
    {
        public EmailService()
        {
            Debug.WriteLine("Create EmailService");
        }
        public void SendEmail(string to, string body)
        {
            Debug.WriteLine($"向{to}发送邮件:{body}");
        }
    }

进行依赖注入

一般我们在MVVM中的viewmodel中进行依赖注入,不会MVVM模式的请看这里WPF之MVVM
MainShellView

    <Grid>
        <Button Content="button" Width="100" Height="50" Command="{Binding RelayCommand}"/>
    </Grid>

MainShellViewModel

    public class MainShellViewModel : ViewModelBase
    {
        private readonly IEmailService _emailService;

        public RelayCommand<string?> RelayCommand { get; set; }
        public MainShellViewModel(IEmailService emailService)
        {
            Debug.WriteLine("Create MainShellViewModel");
            _emailService = emailService;


            RelayCommand = new RelayCommand<string?>(ApplyParam);
        }

        private void ApplyParam(string? obj)
        {
            if (obj != null)
            {
                MessageBox.Show($"有参数:{obj}");
            }
            _emailService.SendEmail("JSC", "Hello World");
        }
    }

服务注册:

  • 为什么要服务注册?当我们注册服务之后,容器会根据我们注册的服务自动帮我们管理依赖注入,也就是当后面我们用到MainShellViewModel时,它会根据构造函数,自动帮我们生成需要的EmailService实体,也就是容器会自动解析这些依赖,不需要我们手动创建。
  • 而且依赖链的自动传递,一旦根对象被解析,其依赖的服务(如ILogger)的构造函数中声明的依赖也会被自动解析。
public partial class App : Application
{
    private IServiceProvider _serviceProvider;
    public App()
    {
        var services = new ServiceCollection();
        ConfigureServices(services);
        _serviceProvider = services.BuildServiceProvider();
    }
    // 注册服务
    private void ConfigureServices(IServiceCollection services)
    {
        services.AddScoped<IEmailService, EmailService>();
        services.AddSingleton<MainShellViewModel>();
        

    }
    private void Application_Startup(object sender, StartupEventArgs e)
    {

    }

    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);

        var mainShellVM = _serviceProvider.GetRequiredService<MainShellViewModel>();
        var mainShellView = new MainShellView { DataContext = mainShellVM };
        mainShellView.Show();
    }
}

服务生命周期

  • Singleton:单例,在整个应用程序生命周期内,只创建一个服务实例。无论从容器中请求多少次,都会返回同一个实例。
  • Transient:瞬时,每次从容器中请求服务时,都会创建一个新的实例。
  • Scoped:作用域,在每个作用域内,服务实例是唯一的。

参考代码地址

相关文章

  • C#依赖注入- setter注入

    在文章 C#依赖注入-初步概念了解 中,简单的介绍了依赖注入常用三种方式:setter注入,构造函数注入,接口注入...

  • 依赖注入

    C#依赖注入-初步概念了解 联系方式

  • Spring学习之依赖注入

    Spring学习之依赖注入 依赖注入的基本概念 依赖注入(Dependecy Injection),也称为IoC(...

  • 开源项目的依赖注入

    开源项目的依赖注入 依赖注入概念 依赖注入(DI:Dependency Injection): 依赖注入方式: B...

  • 资料收集

    依赖注入 AngularJs依赖注入的研究 (已读) 依赖注入(已读)

  • spring的使命

    spring的使命:简化Java开发 降耦合的一种方式为 依赖注入,而构造器注入是依赖注入的一种。 创建应用组件之...

  • Dagger2常用注解诠释

    依赖注入 控制反转(IoC)与依赖注入(DI)浅谈依赖注入理解依赖注入(IOC)和学习Unity Gradle配置...

  • Day62 Spring 依赖注入源码解析

    手动注入自动注入 依赖注入,set注入,构造注入 依赖注入: Key依据 byType byName constr...

  • Spring之依赖注入

    六、依赖注入 目录:构造器注入、set注入、拓展注入实现、Bean的作用域依赖注入(Dependency Inje...

  • Dagger2 源码分析

    Dagger简单介绍 Dagger2涉及到依赖注入,有关依赖注入的请到理解依赖注入 通过注解方式实现依赖注入分为两...

网友评论

      本文标题:C#之依赖注入

      本文链接:https://www.haomeiwen.com/subject/neyebjtx.html