.net core 依赖项未直接注入.NET Core中的私有字段

.net core 依赖项未直接注入.NET Core中的私有字段,.net-core,dependency-injection,.net Core,Dependency Injection,在我的appsettings.json文件中,我有一个如下部分: "MongoDbSettings": { "ConnectionString": "mongodb://localhost:127.0.0.1", "DatabaseName": "ComparisonDb" } 而且,我有一个自定义类,它可以处理以上两个子部分 public interface IMongoDbSet

在我的
appsettings.json
文件中,我有一个如下部分:

"MongoDbSettings": {
   "ConnectionString": "mongodb://localhost:127.0.0.1",
   "DatabaseName": "ComparisonDb"
}
而且,我有一个自定义类,它可以处理以上两个子部分

public interface IMongoDbSetting
{
    string DatabaseName { get; set; }

    string ConnectionString { get; set; }
}

public class MongoDbSetting : IMongoDbSetting
{
    public string DatabaseName { get; set; }

    public string ConnectionString { get; set; }
}
我对我的
Startup.cs
文件做了以下定义:

        services.Configure<MongoDbSetting>(Configuration.GetSection("MongoDbSettings"));

        //...

        services.AddSingleton<IMongoDbSetting>(serviceProvider => serviceProvider.GetRequiredService<IOptions<MongoDbSetting>>().Value);

        services.AddControllers();
MongodBrespositoryBase:

    public class MongoDbRepositoryBase<T> : IOperation<T> where T : class
    {
        private readonly IMongoCollection<T> _collection;

        public MongoDbRepositoryBase(IMongoDbSetting settings)
        {
            IMongoDatabase database = new MongoClient(settings.ConnectionString).GetDatabase(settings.DatabaseName);

            _collection = database.GetCollection<T>(GetCollectionName(typeof(T)));
        }

       //CRUD methods
    }
public类MongoDbRepositoryBase:IOOperation其中T:class
{
私人只读IMongoCollection\u collection;
公共MongoDbRepositoryBase(IMongoDbSetting设置)
{
IMongoDatabase database=new MongoClient(settings.ConnectionString).GetDatabase(settings.DatabaseName);
_collection=database.GetCollection(GetCollectionName(typeof(T));
}
//积垢法
}

据我所知,ASP.NET核心的DI只支持构造函数注入。所以你需要类似于

public UserRepository(IMongoDbSetting mongoDbSetting, ...) {
    _mongoDbSetting = mongoDbSetting;
    // and so on
}
让DI注入你想要的东西

或者(我个人不会采用这种方式,但这是一种选择),您可以让您的代码直接要求
服务提供商提供一个实例,这里有一个示例


作为旁注,您的
\u mongoDbSettings
字段也是
私有的
。我相信可以进行现场注入的DI框架至少需要得到保护。可能是错误的,但这是未来需要记住的。

据我所知,ASP.NET Core的DI只支持构造函数注入。所以你需要类似于

public UserRepository(IMongoDbSetting mongoDbSetting, ...) {
    _mongoDbSetting = mongoDbSetting;
    // and so on
}
让DI注入你想要的东西

或者(我个人不会采用这种方式,但这是一种选择),您可以让您的代码直接要求
服务提供商提供一个实例,这里有一个示例


作为旁注,您的
\u mongoDbSettings
字段也是
私有的
。我相信可以进行现场注入的DI框架至少需要得到保护。可能是错误的,但这是未来需要记住的。

用户存储库是否有我缺少的构造函数?@Josephrot不,它没有你应该检查的构造函数,
UserRepository
是否有我缺少的构造函数?@Josephrot不,它没有你应该检查和
public UserRepository(IMongoDbSetting mongoDbSetting, ...) {
    _mongoDbSetting = mongoDbSetting;
    // and so on
}