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

.NET Core中MongoDB数据库上下文注入为空问题的排查

问题分析与解决方案

你的问题核心出在DataService构造函数的赋值逻辑错误,同时还有几个需要注意的细节点,我一步步给你拆解:

1. 构造函数赋值完全搞反了

看你的DataService代码:

public PortfolioDbContext _db; 
public DataService(PortfolioDbContext _db) 
{ 
    _db = this._db; 
}

这里你把类的字段this._db(默认是null)赋值给了构造函数的参数_db,而不是把传入的参数赋值给类字段。正确的赋值应该是反过来:

public PortfolioDbContext _db; 
public DataService(PortfolioDbContext _db) 
{ 
    this._db = _db; 
}

或者更清晰的做法是给参数起不同的名字,同时把字段设为private readonly(避免外部意外修改,符合依赖注入最佳实践):

private readonly PortfolioDbContext _db;
public DataService(PortfolioDbContext dbContext) 
{ 
    _db = dbContext; 
}

这是导致_db始终为null的直接原因。

2. 其他需要确认的细节

除了构造函数的问题,还要检查以下两点:

  • DataService是否注册到DI容器:如果你是手动new DataService()创建实例,而不是通过DI容器获取(比如构造函数注入或者serviceProvider.GetService<DataService>()),那DI不会帮你注入PortfolioDbContext,_db自然还是null。确保在启动项里注册DataService,比如:
    services.AddScoped<DataService>(); // 根据业务需求选择Scoped/Transient/Singleton
    
  • PortfolioDbContext的注册位置:确保services.AddSingleton<PortfolioDbContext>();是在Program.cs(或Startup.cs)的服务配置部分,在builder.Build()之前执行,确保DI容器能正确识别这个服务。

修正后的完整代码示例

PortfolioDbContext(略作优化,字段名更清晰)

public class PortfolioDbContext 
{ 
    public readonly IMongoCollection<PortfolioData> PortfolioCollection; 
    public PortfolioDbContext() 
    { 
        var client = new MongoClient("mongodb://localhost:27017"); 
        PortfolioCollection = client.GetDatabase("portfolioServiceDb").GetCollection<PortfolioData>("Portfolios"); 
    } 
}

DataService

public class DataService
{
    private readonly PortfolioDbContext _db;

    public DataService(PortfolioDbContext dbContext)
    {
        _db = dbContext;
    }

    // 示例业务方法
    public async Task<List<PortfolioData>> GetAllPortfolios()
    {
        return await _db.PortfolioCollection.Find(_ => true).ToListAsync();
    }
}

启动项注册

var builder = WebApplication.CreateBuilder(args);

// 注册上下文和服务
builder.Services.AddSingleton<PortfolioDbContext>();
builder.Services.AddScoped<DataService>();

var app = builder.Build();

// 后续中间件配置...

内容的提问来源于stack exchange,提问作者moris62

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 21:27:30