IOC在Web API 中是经常使用的,但是在一些WPF项目并不是经常使用或者被人熟知的,我把相关依赖注入的内容又做了一次学习和整理
什么是依赖注入?
依赖注入是一种设计模式和软件设计原则,用于实现 控制反转。它的核心思想是:将对象所依赖的其他对象的创建和管理职责从对象内部转移到外部容器或框架,从而降低代码的耦合度,提高可测试性、可维护性和灵活性。
依赖注入的主要优点
- 降低耦合度(Decoupling):
○ 组件(如 OrderService)只依赖于接口(如 IOrderRepository),而不依赖于具体实现(如 SqlOrderRepository)。具体实现的切换由外部容器控制。 - 提高可测试性(Testability):
○ 可以轻松地为依赖项创建 Mock 或 Stub 对象(实现相同的接口),并在测试时注入到被测试对象中。这使得单元测试独立、快速且可靠(不依赖数据库、网络等外部资源)。 - 提高可维护性和可扩展性:
○ 更容易替换依赖的实现(只需在容器配置中更改绑定关系)。
○ 更容易添加新功能(添加新实现并注册到容器即可)。
○ 代码更清晰,职责更单一。 - 促进代码重用:
○ 解耦后的组件更容易在不同的上下文中复用。 - 管理对象生命周期:
○ DI 容器通常提供对依赖对象生命周期的管理(如单例、每次请求创建新实例、线程内单例等),简化了资源管理。
NET 项目使用依赖注入
● Microsoft.Extensions.DependencyInjection.Abstractions
● Microsoft.Extensions.Dependencyinjection
核心类型
● IServiceCollection 服务注册
● ServiceDescriptor 服务注册时的信息
● IServiceProvider 具体的容器
● IServiceScope 子容器生命周期
生命周期
1.AddSingleton 单例生命周期
● 在整个进程中,多次创建对象都是同一个对象—遵循了单例模式;
● 第一次创建以后,在内存中,保存下来了,下次创建–直接使用内存,而不是再去全新的创建
ServiceCollection serviceDescriptors = new ServiceCollection();
serviceDescriptors.AddSingleton<ITestService, TestService>();
ServiceProvider serviceProvider = serviceDescriptors.BuildServiceProvider();
ITestService testService1 = serviceProvider.GetService<ITestService>();
ITestService testService2 = serviceProvider.GetService<ITestService>();
bool isflg = object.ReferenceEquals(testService1, testService2);
Console.WriteLine($"testService1==testService2 {
isflg}"); //true
2.AddScoped 作用域生命周期
● 每一个作用域(serviceProvider)内创建的某一个类的对象是同一个实例
● 不同的作用域(serviceProvider)内创建的同一个类的对象是不同的实例
● 这种⽣命周期适⽤于需要在特定作⽤域内共享对象实例的情 况,⽐如Web应⽤程序中的每个HTTP请求
ServiceCollection serviceDescriptors = new ServiceCollection();
serviceDescriptors.AddScoped<


1446

被折叠的 条评论
为什么被折叠?



