# Huioo.Learning.DependencyInjection **Repository Path**: huioo/huioo-learning-dependencyinjection ## Basic Information - **Project Name**: Huioo.Learning.DependencyInjection - **Description**: 依赖倒置原则 - DIP - Dependency Inversion Principle - **Primary Language**: C# - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-05-12 - **Last Updated**: 2025-05-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Huioo.Learning.DependencyInjection 依赖倒置原则(DIP) 依赖注入(Dependency Injection, DI)是控制反转(Inversion of Control, IOC)思想的实现方式。简化模块的组装过程,降低模块之间的耦合度。 ```csharp var connSettings = ConfigurationManager.ConnectionStrings["connStr1"]; string connStr = connSettings.ConnectionString; SqlConnection conn = new SqlConnection(connStr); ``` “怎么创建XX对象” → “我要XX对象” 两种实现方式: 1. 服务定位器(ServiceLocator); 2. 依赖注入(Dependency Injection, DI); ```csharp # 服务定位器 IDbConnection conn = ServiceLocator.GetService(); # 依赖注入 class Demo { public IDbConnection Conn { get; set; } public void InsertDB() { IDbCommand cmd = Conn.CreateCommand(); } } ``` 服务(service):对象; 注册服务; 服务容器:负责管理注册的服务; 查询服务:创建对象及关联对象; 对象生命周期:Transient(瞬态)、Scoped(作用域、范围)、Singleton(单例); 根据类型来获取和注册服务。 可以分别指定服务类型(service type)和实现类型(implementation type)。这两者可能相同,也可能不同。服务类型可以是类,也可以是接口,建议面向接口编程,更灵活。 .NET控制暗转组件取名为DependencyInjection,但它包含ServiceLocator的功能。 1. 给类构造函数中打印,看看不同生命周期的对象创建,使用serviceProvider.CreateScope()创建作用域Scope,看看对象的生命周期。 2. 如果一个类实现了IDisposable接口,则离开作用域之后容器会自动调用对象的Dispose方法。 3. 不要在长生命周期的对象中引用比它短的生命周期的对象。在ASP.NET Core中,这样做默认会抛出异常。 4. 生命周期的选择:如果类无状态,建议为Singleton;如果类有状态,且有Scope控制,建议为Scoped。因为通常这种Scope控制下的代码都是运行在同一个线程中的,没有并发修改的问题;在使用Transient的时候要谨慎。 - 单例:整个应用程序生命周期内,只有一个对象实例。 - 瞬态:每次请求对象时,都会创建一个新的对象实例。 - 作用域:在一个特定的作用域内,只有一个对象实例。 5. .NET注册服务的重载方法很多。 总结 关注于接口,而不是实现。各个服务可以更弱耦合的协同工作,在编写代码的时候,我们甚至不知道具体的服务是什么。 第三方DI容器:Autofac等。Autofac优点:支持属性注入、基于名字注入、基于约定的注入等。