C#对动态加载的DLL进行依赖注入,并对DLL注入服务
文章目录
- 什么是依赖注入
-
- 概念
- 常用的依赖注入实现
- 什么是动态加载
-
- 定义
- 示例
- 对动态加载的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为服务,并且注入MyClassB
serviceCollection.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