从LightInject迁移到.NET Core DI容器的等效注册方式咨询
LightInject迁移至.NET Core内置DI容器的等效注册实现
a. 构造函数依赖注册的等效实现
原LightInject代码的作用是全局为所有构造函数中的IBar类型参数指定固定的创建逻辑,.NET Core DI中常规场景可直接通过服务注册实现:
// 生命周期可根据原业务需求替换为AddScoped/AddSingleton services.AddTransient<IBar>(serviceProvider => new Bar());
如果原逻辑需要用到入参的parameterInfo做差异化注入(比如根据参数名、所属服务类型返回不同实现),.NET Core DI原生没有直接对应的封装API,可通过自定义服务工厂、或者使用ActivatorUtilities自定义构造逻辑实现。
b. 带参数的工厂委托注册的等效实现
原LightInject代码是注册一个接收用户名、密码参数的委托,委托执行时会从容器中拉取IBusinessLogic实例来构造MemCache对象。注意原代码中注册的Func<string, string>签名和实际委托返回值不匹配,属于笔误,实际应为Func<string, string, MemCache>,等效实现如下:
// 先注册IBusinessLogic的对应实现,生命周期和原有逻辑保持一致即可 services.AddTransient<IBusinessLogic, YourBusinessLogicImpl>(); // 注册工厂委托,单例生命周期即可,委托执行时会从当前作用域获取服务 services.AddSingleton<Func<string, string, MemCache>>(sp => (username, password) => new MemCache(username, password, sp.GetRequiredService<IBusinessLogic>()));
如果实际业务中委托的返回值确实为string,按需调整工厂返回值即可。
内容的提问来源于stack exchange,提问作者191180rk
相关产品推荐
相关产品推荐

