依赖关系的生命周期管理是以一种使应用程序组件彼此独立且易于测试的方式组织创建、初始化、更新和销毁这些组件。为此,通常使用IoC容器(控制反转)和依赖注入(DI)模式。
IoC容器允许:
C#示例,使用Microsoft.Extensions.DependencyInjection:
public interface IMessageSender { void Send(string msg); } public class EmailSender : IMessageSender { public void Send(string msg) { /* 发送电子邮件 */ } } // 注册依赖关系 var services = new ServiceCollection(); services.AddScoped<IMessageSender, EmailSender>(); // 获取实例 var provider = services.BuildServiceProvider(); var sender = provider.GetService<IMessageSender>(); sender.Send("你好!");
关键特性:
依赖注入(DI)与服务定位器模式有什么区别,为什么服务定位器被认为是反模式?
服务定位器破坏了依赖关系的显式传递,使代码不够透明。更好的是通过构造函数或方法使用DI,以便编译器能控制依赖关系的正确性。
// 差:服务定位器 var sender = ServiceLocator.Get<IMessageSender>(); // 好:通过DI public class MyService { public MyService(IMessageSender sender) { ... } }
单例模式和DI容器中的单实例生命周期有什么区别?
单例模式是手动实现的,不依赖于容器;单实例从容器提供实例,对单元测试和扩展来说更安全。
是否需要在所有类中注入依赖,即使是简单的工具类?
不需要。没有依赖关系的工具类或弱耦合的助手类(例如数学常量类)不需要注入DI——这会使代码复杂化,而没有任何好处。