当前位置: 首页 > article >正文

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

http://www.kler.cn/a/504863.html

相关文章:

  • 使用yarn命令创建Vue3项目
  • SpeingMVC框架(三)
  • 【源码】Sharding-JDBC源码分析之SQL重写实现原理
  • wpa_cli命令使用记录
  • 活动预告 | CCF开源发展委员会开源供应链安全技术研讨会(2025第一期)——“大模型时代的开源供应链安全风控技术”...
  • 51_Lua面向对象编程
  • 前端组件开发:组件开发 / 定义配置 / 配置驱动开发 / 爬虫配置 / 组件V2.0 / form表单 / table表单
  • linux 端口转发工具rinetd
  • Flask安全开发
  • 亚洲科技创新之夜即将闪耀CES Asia 2025首日
  • 网络安全测评质量管理与标准解读
  • Tmux复制时将内容传递到系统剪贴板
  • vue2 web 多标签输入框 elinput是否当前焦点
  • C++ 数据结构:基本概念、时间复杂度、空间复杂度
  • YOLOv9改进,YOLOv9自研检测头融合HAttention用于图像修复的混合注意力检测头
  • Leetcode 474. 一和零 多重背包问题,动态规划
  • QT 键值对集合QMap
  • 【WEB】网络传输中的信息安全 - 加密、签名、数字证书与HTTPS
  • 标准通上线标准「全文检索」功能,提升查询精准度!
  • Android控件底色蓝色无法修改、高版本无法安装app、找不到xml、找不到java文件、目录不显示等问题
  • windows下编译php源码
  • 基于PyQt - 6的医疗多模态大模型医疗研究系统中的创新构建与应用(上 .文章部分)
  • 神经网络
  • TCP 连接状态标识 | SYN, FIN, ACK, PSH, RST, URG
  • 链路追踪SkyWalking
  • Shell正则表达式与文本处理三剑客(grep、sed、awk)