.NET Core 3.1类库间依赖注入实现及相关疑问咨询
.NET Core 3.1 类库间依赖注入实现方案
关于Activator的假设:不正确
.NET Core自带原生依赖注入(DI)框架,完全不需要使用Activator手动实例化对象,也无需像MVC5那样单独创建Ninject等第三方DI项目。所有DI配置统一在**有启动入口的项目(比如你的MVC项目)**中完成即可。
具体实现步骤(结合你的代码修正)
1. 理清项目依赖关系
- BLL类库引用DAL类库(建议遵循依赖倒置原则,优先引用DAL的接口项目,而非实现项目)
- MVC项目同时引用BLL和DAL类库
2. 修正DAL层代码(接口与实现匹配)
你的DAL代码存在接口与实现不匹配的问题,DalClass1实现的是IDalInterface1,但扩展方法中注册的却是IInterfaceFromBL,这会导致DI容器无法解析,先修正:
// DAL_Service 接口定义 namespace DAL_Service { public interface IDalInterface1 { string fnGetStringVal(); } } // DAL_Service 实现类 namespace DAL_Service { public class DalClass1 : IDalInterface1 { public string fnGetStringVal() { return "xx"; } } }
3. 修正DAL层服务注册扩展方法
确保注册的接口与实现类对应:
using Microsoft.Extensions.DependencyInjection; namespace DAL_Service { public static class ServiceCollectionExtensions { public static IServiceCollection AddDAL(this IServiceCollection services) { // 注册DAL接口与实现,生命周期根据业务选择Scoped/Transient/Singleton return services.AddScoped<IDalInterface1, DalClass1>(); } } }
4. 在BLL层中注入DAL接口
通过构造函数注入DAL接口,实现BLL对DAL的依赖:
// BLL_Service 接口定义(比如你的IUserBll) namespace BLL_Service { public interface IInterfaceFromBL { string fnGetStringVal(); } } // BLL_Service 实现类,构造注入DAL接口 namespace BLL_Service { public class BLLClass1 : IInterfaceFromBL { private readonly IDalInterface1 _dal; // 构造函数注入DAL接口,DI容器会自动解析实例 public BLLClass1(IDalInterface1 dal) { _dal = dal; } public string fnGetStringVal() { // 调用DAL方法 return _dal.fnGetStringVal(); } } }
5. BLL层服务注册扩展方法
同样用扩展方法封装BLL的服务注册:
using Microsoft.Extensions.DependencyInjection; namespace BLL_Service { public static class BllServiceExtensions { public static IServiceCollection AddBLL(this IServiceCollection services) { return services.AddScoped<IInterfaceFromBL, BLLClass1>(); } } }
6. 在MVC项目的Startup中统一注册服务
在MVC项目的Startup.cs的ConfigureServices方法中,调用BLL和DAL的扩展方法完成注册:
using BLL_Service; using DAL_Service; using Microsoft.Extensions.DependencyInjection; public class Startup { public void ConfigureServices(IServiceCollection services) { services.AddControllersWithViews(); // 先注册DAL,再注册BLL services.AddDAL(); services.AddBLL(); } }
关键说明
- 类库项目没有独立启动入口,因此DI的注册必须在有启动入口的项目(如MVC、Console)中完成,类库仅需提供扩展方法封装自身的服务注册逻辑。
- 无需手动使用
Activator,.NET Core的DI容器会自动处理构造函数注入的依赖解析。 - 生命周期选择:根据业务场景选择
Scoped(每次请求一个实例)、Transient(每次获取一个新实例)、Singleton(全局单例)。
内容的提问来源于stack exchange,提问作者Neal Rogers
相关产品推荐
相关产品推荐

