C# NET核心-业务逻辑层的DI

C# NET核心-业务逻辑层的DI,c#,entity-framework,asp.net-web-api,asp.net-core,.net-core,C#,Entity Framework,Asp.net Web Api,Asp.net Core,.net Core,我的项目中有4个级别——webapi(UI)、业务逻辑、DAL和DBContext 在上下文文件中,我使用AddDBContext添加了DBContext,并使用ADDScoped添加了biz逻辑对象。所以在控制器的构造函数中,我能够自动地获得bizlogic对象的实例。在bizlogics的构造函数中,我能够得到DBContext的实例 但我想要实现的是使用DI在bizlogic层创建DAL实例。我尝试在startup.cs中使用AddScope,但它不起作用。下面是代码 Startup.cs

我的项目中有4个级别——webapi(UI)、业务逻辑、DAL和DBContext

在上下文文件中,我使用AddDBContext添加了DBContext,并使用ADDScoped添加了biz逻辑对象。所以在控制器的构造函数中,我能够自动地获得bizlogic对象的实例。在bizlogics的构造函数中,我能够得到DBContext的实例

但我想要实现的是使用DI在bizlogic层创建DAL实例。我尝试在startup.cs中使用AddScope,但它不起作用。下面是代码

Startup.cs

 public void ConfigureServices(IServiceCollection services)
    {
        // Add framework services.
        services.AddMvc();
        services.AddDbContext<ClientEntities>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));


        // Repositories
        //services.AddScoped<IDBClient, DBClient>(); -- my DAL layer
        services.AddScoped<ITAConfigRepository, TAConfigRepository>(); -- my biz logic layer

        //var dbContext = DBContextFactory.Create("DB1");
        //services.AddEntityFrameworkSqlServer().AddDbContext<dbContext>(); -- my DbContext layer

    }
 public TAMController(ITAConfigRepository repo)
    {
        _itaconfigrepository = repo;
    }
bizlogic层

public TAConfigRepository(ClientEntities context)  -- This works
    {
        ctx = context;
    }

public TAConfigRepository(IDBClient obj)  -- This does not work
    {
        _dbclient = obj;
    }
 public DBClient(ClientEntities ctx)
    {
        _context = ctx;
    }
 public ClientEntities(DbContextOptions<ClientEntities> options) : base(options)
    {
    }
DAL层

public TAConfigRepository(ClientEntities context)  -- This works
    {
        ctx = context;
    }

public TAConfigRepository(IDBClient obj)  -- This does not work
    {
        _dbclient = obj;
    }
 public DBClient(ClientEntities ctx)
    {
        _context = ctx;
    }
 public ClientEntities(DbContextOptions<ClientEntities> options) : base(options)
    {
    }
DBContextlayer

public TAConfigRepository(ClientEntities context)  -- This works
    {
        ctx = context;
    }

public TAConfigRepository(IDBClient obj)  -- This does not work
    {
        _dbclient = obj;
    }
 public DBClient(ClientEntities ctx)
    {
        _context = ctx;
    }
 public ClientEntities(DbContextOptions<ClientEntities> options) : base(options)
    {
    }
公共客户端(DbContextOptions选项):基本(选项)
{
}
我如何做到这一点?一些ppl可能建议使用DAL层,但如果我想在这个biz逻辑类中创建任何其他biz逻辑类的实例,问题仍然是一样的

此外,如果有任何错误,我只得到500个错误。我没有看到实际的错误。我如何看待实际的错误


提前感谢。

@TSeng的最后一条评论有效,出于某种原因,我的代码中的构造函数是私有的。将其更改为public后,它开始工作。

如果在启动时未注册
IDBClient
,则无法使用它。就这么简单。所以我试过了,但还是不起作用。它只显示500个错误。它甚至没有击中控制器。我如何看待错误?如果我理解正确,如果我们在startup.cs文件中注册,我们可以将其注入任何控制器,即使该类位于不同的项目中。对吗?每个依赖项都必须注册。无法注入未注册的依赖项。该类位于哪个库中,正在解析哪个库并不重要。唯一重要的是,它是从DI解析的,并且不限于控制器,但由于控制器是每个请求的入口点,ASP.NET核心隐式解析控制器参数,从而解析该服务的依赖关系(也就是说,Controller可能会解析IUserRepository,UserRepository可能会将ApplicationDbContext作为依赖项)不,这不是我说的。它应该可以工作,但您在某个地方出现了错误或缺少注册,即
服务.AddScoped()
服务.AddScoped()
而不是
服务.AddScoped()