You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 22:39:17