文章目录
- 什么是依赖注入
- 概念
- 常用的依赖注入实现
- 什么是动态加载
- 定义
- 示例
- 对动态加载的DLL进行依赖注入
什么是依赖注入
依赖注入(Dependency Injection,简称 DI)是一种软件设计模式,用于解耦软件组件之间的依赖关系。在 C# 开发中,它主要解决的是类与类之间的强耦合问题。例如,一个类 A 依赖于另一个类 B,如果不使用依赖注入,那么在类 A 内部可能会直接实例化类 B,这就使得类 A 和类 B 紧密地耦合在一起。而依赖注入的方式是将类 B 的实例通过外部(通常是在类 A 的构造函数、属性或者方法参数中)传递给类 A,从而降低它们之间的耦合程度。
- 作用
提高可维护性:当系统规模变大时,如果各个组件之间耦合紧密,修改其中一个组件可能会牵一发而动全身。通过依赖注入,组件之间的依赖关系更加清晰,维护起来更加容易。
方便单元测试:在进行单元测试时,可以方便地模拟依赖对象,而不是依赖于真实的复杂对象,从而使测试更加简单和准确。
常用的依赖注入实现
Microsoft.Extensions.DependencyInjection
using Microsoft.Extensions.DependencyInjection;
class MyClassA
{private MyClassB _dependency;public MyClassA(MyClassB dependency){_dependency = dependency;}public void DoSomething()=>_dependency.SomeMethod();
}
class MyClassB
{public void SomeMethod()=>Console.WriteLine("MyClassB's method is called.");
}
class Program
{static void Main(){// 创建服务容器var serviceCollection = new ServiceCollection();// 注册MyClassB为服务,每次请求MyClassB时会创建一个新的实例serviceCollection.AddTransient<MyClassB>();// 注册MyClassA为服务,并且注入MyClassBserviceCollection.AddTransient<MyClassA>();// 构建服务提供器var serviceProvider = serviceCollection.BuildServiceProvider();// 获取MyClassA的实例,此时会自动注入MyClassB的实例var a = serviceProvider.GetService<MyClassA>();a.DoSomething();}
}
Autofac
using Autofac;
class MyClassA
{private MyClassB _dependency;public MyClassA(MyClassB dependency){_dependency = dependency;}public void DoSomething