如何在.NET Framework 4.8类库中使用Microsoft Dependency Injection依赖注入
问题解决方法
核心问题原因
- 你直接用
new B()手动实例化对象,DI容器不会主动介入构造过程,自然无法自动注入依赖 - 你当前的
Register方法里每次创建新的ServiceCollection,注册完成后没有构建为IServiceProvider并持久化存储,所有注册逻辑执行完就被回收,相当于没有注册任何服务
正确实现步骤
1. 改造依赖容器,持久化存储服务提供者实例
using Microsoft.Extensions.DependencyInjection; public static class DependencyContainer { // 全局存储构建完成的服务提供者 public static IServiceProvider ServiceProvider { get; private set; } public static void Register() { var services = new ServiceCollection(); // 注册接口与对应实现 services.AddTransient<InterfaceA, A>(); // 需要解析的类B也要注册到容器,DI才能识别其构造依赖 services.AddTransient<B>(); // 构建服务提供者并持久化 ServiceProvider = services.BuildServiceProvider(); } }
2. 修正B类的构造函数声明,显式声明依赖
public class B { // 公共构造函数,参数为需要注入的依赖项 public B(InterfaceA interfaceA) { // 此处可将注入的interfaceA赋值给类内私有字段使用 } }
3. 从容器解析B的实例,不要手动new
注意:调用GetService方法需要引入Microsoft.Extensions.DependencyInjection命名空间
public class MainClass { public void DoStuff() { DependencyContainer.Register(); // 从服务提供者获取B的实例,DI会自动注入已注册的InterfaceA实现 var myB = DependencyContainer.ServiceProvider.GetService<B>(); } }
类库场景注意事项
如果你的类库是提供给外部应用调用的,建议将服务注册的入口暴露给调用方,不要在类库内部硬编码注册逻辑,方便调用方根据自身需求替换接口实现,避免强耦合。
内容的提问来源于stack exchange,提问作者Banshee
相关产品推荐
相关产品推荐

