看不懂依赖注入代码为啥这样写?

来源:4-5 【理论】复合

慕粉13126187115

2024-08-15

问下,1. 依赖注入创建成员变量后,然后为啥声明构造函数去赋值,不理解

  1. 依赖注入 和 new 一个实例有什么区别?感觉new一个更为简单图片描述
写回答

1回答

阿莱克斯刘

2024-08-15

1. 依赖注入创建成员变量后,为什么还要声明构造函数去赋值?

在C#中,依赖注入(Dependency Injection, DI)通常通过构造函数注入来实现。使用构造函数注入有以下几个原因:

1)强制依赖:通过构造函数注入,可以确保在对象创建时,所有必需的依赖项都已经被提供。这避免了对象在未完全初始化的状态下被使用。例如:
public class MyClass {
    private readonly IDependency _dependency;  
    public MyClass(IDependency dependency
    {
        _dependency = dependency ?? throw new ArgumentNullException(nameof(dependency));
     }
}

2)不可变性:构造函数注入可以使依赖项成为只读的(readonly),这在多线程环境中尤其重要,有助于提高代码的安全性和稳定性。

3)清晰性:构造函数注入使得依赖关系在对象创建时就明确,代码更易于阅读和理解。

2. 依赖注入和 new 一个实例有什么区别?

虽然直接使用 new 来创建对象看起来更简单,但依赖注入和 new 有几个关键区别:

1)解耦:依赖注入通过容器管理对象的创建和依赖关系,使得代码更加解耦。这样,类之间的依赖关系不再硬编码在类内部,便于后期维护和修改。例如,使用依赖注入框架(如ASP.NET Core的内置DI容器):
public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddTransient<IDependency, DependencyImplementation>();
        services.AddTransient<MyClass>();
    }
}

2)可测试性:使用依赖注入,可以轻松地替换依赖项(例如使用模拟对象),从而更方便地进行单元测试。例如:

var mockDependency = new Mock<IDependency>(); var myClass = new MyClass(mockDependency.Object);


3)灵活性:依赖注入允许在运行时动态地配置和替换依赖项,而不需要修改代码。这对于大型项目和复杂应用程序尤为重要。

4)生命周期管理:依赖注入框架可以管理对象的生命周期,包括初始化和销毁,这在复杂应用中非常有用。例如,ASP.NET Core的DI容器可以管理对象的作用域(Scoped)、瞬态(Transient)和单例(Singleton)生命周期。

希望这些解释对你有帮助。

0
0

C#速成指南--从入门到进阶,实战WPF与Unity3D开发

系统掌握C#核心和应用,获得全行业适配的技能

839 学习 · 198 问题

查看课程