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

C# 依赖注入如何实现

在 C# 中,依赖注入(Dependency Injection,简称 DI)是一种编程技术,用于减少代码之间的耦合。依赖注入可以通过构造函数注入、属性注入或方法注入实现。在 .NET Core 和 .NET 5+ 中,还提供了一个内置的依赖注入容器。

以下是一个简单的构造函数注入的例子:

public interface IService
{void Serve();
}public class Service : IService
{public void Serve(){Console.WriteLine("Service Called");//To Do: Some Stuff}
}public class Client
{private IService _service;public Client(IService service){this._service = service;}public void Start(){Console.WriteLine("Service Started");this._service.Serve();//To Do: Some Stuff}
}

在这个例子中,Client 类依赖于 IService。通过将 IService 作为 Client 的构造函数的参数,我们可以在创建 Client 对象时将任何实现了 IService 接口的对象注入 Client。这样,Client 就不再直接依赖于 Service 类,而是依赖于 IService 接口,这降低了代码之间的耦合。

.NET Core 和 .NET 5+ 提供了一个内置的依赖注入容器,可以更容易地实现依赖注入。以下是一个例子:

public void ConfigureServices(IServiceCollection services)
{services.AddTransient<IService, Service>();
}

在这个例子中,AddTransient 方法告诉依赖注入容器,每次有类需要 IService 时,都应该创建一个新的 Service 类实例。你也可以使用 AddSingleton 方法来创建一个在整个应用程序生命周期中只有一个实例的服务,或者使用 AddScoped 方法来创建一个在每个请求作用域中都是唯一的服务。

总的来说,依赖注入是一种强大的技术,可以帮助你创建更灵活、更易于测试和维护的代码。虽然实现依赖注入需要一些额外的工作,但在大多数情况下,这都是值得的。

依赖注入主要有三种形式:构造器注入,属性注入和方法注入。

  1. 构造器注入:这是最常见的依赖注入类型,也是最推荐的类型。在这种情况下,依赖性(如服务或组件)通过类的构造函数传递。

  2. 属性注入:在这种情况下,依赖性通过类的公共属性设置。这种类型的注入一般不推荐,因为它可能会导致对象的状态在创建后被改变。但在某些情况下,例如在处理与框架集成的情况下,属性注入可能是必要的。

  3. 方法注入:在这种情况下,依赖性通过方法参数传递。这种类型的依赖注入主要用于那些只有在特定方法调用时才需要依赖的情况。

在.NET Core中,有一个内置的依赖注入服务容器,用于注册和解析依赖关系。以下是如何使用内置DI容器的示例:

public class Startup
{public void ConfigureServices(IServiceCollection services){// 注册服务services.AddScoped<IMyService, MyService>();}
}

在上述代码中,AddScoped方法用于将服务MyService注册为作用域生命周期的服务。这意味着在相同的请求中,每次请求IMyService都会得到相同的实例。其他可用的方法有AddTransient(每次请求都创建新的实例)和AddSingleton(整个应用程序生命周期内只创建一个实例)。

然后,在需要使用服务的地方,你只需要在构造函数中添加一个参数:

public class MyController : Controller
{private readonly IMyService _myService;public MyController(IMyService myService){_myService = myService;}public IActionResult Index(){_myService.DoSomething();return View();}
}

在这个例子中,当创建MyController的新实例时,.NET Core的依赖注入容器会自动提供IMyService的实例。

依赖注入是一种强大的设计模式,它能够帮助你管理和解耦你的代码,使代码更易于测试和维护。

http://www.lryc.cn/news/235763.html

相关文章:

  • Redis 9 数据库
  • 43-设计问题-最小栈
  • 基于RK3588全高端智能终端机器人主板
  • 穿越风波,“长红”的直播电商依然扎根产业和消费者
  • LLM大模型 (chatgpt) 在搜索和推荐上的应用
  • 中国净初级生产力年度合成产品NPP(MYD17A3H.006)
  • GitHub如何删除仓库
  • 漫谈广告机制设计 | 万剑归宗:聊聊广告机制设计与收入提升的秘密(3)
  • 安装系统时无raid驱动处理办法
  • ForkLift:macOS文件管理器/FTP客户端
  • 信息系统项目管理师 第四版 第20章 高级项目管理
  • Apache Pulsar 技术系列 - 基于 Pulsar 的海量 DB 数据采集和分拣
  • HDFS、MapReduce原理--学习笔记
  • PC端使子组件的弹框关闭
  • PHPStorm PHP-CS-Fixer
  • SpringBoot中日志的使用log4j
  • 迭代器与生成器
  • 适用于 Windows 的 10 个最佳视频转换器:快速转换高清视频
  • 分布式锁的概念、应用场景、实现方式和优缺点对比
  • Linux:常见指令
  • 大数据基础设施搭建 - ZooKeeper
  • 网站优化工具Google Optimize
  • PostgreSQL创建分区表,并插入大量数据
  • NewStarCTF2023 Reverse Week3 EzDLL WP
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • php-cli
  • [C/C++] 数据结构 LeetCode:用队列实现栈
  • ESP32网络开发实例-物联网声污染监测系统
  • Unexpected error from cudaGetDeviceCount 错误解决
  • 目标检测—YOLO系列(二 ) 全面解读复现YOLOv1 PyTorch