C# IOptions 无法将我的对象隐式转换为接口以将其注入我的服务 AddSingleton

C# IOptions can't implicity convert my object to the interface to inject it into my services AddSingleton

我正在学习如何将 MongoDB 与 C# ASP.NET 一起使用,并且我一直在遵循 Microsoft 关于使用 MongoDB Mongo Doc Guide 的指南。我已经进入添加配置模型部分的第 3 步,我正在尝试在服务单例中注入我的配置接口,以便它像指南中所说的那样解析我的配置模型的实例。我使用与指南完全相同的代码来处理我的对象,尽管它一直抛出一个错误,指出 Cannot implicitly convert type 'Models.UserDBSettings' to 'Models.IUserDBSettings'. An explicit conversion exists (are you missing a cast?)。所以我想知道如何解决这个问题?感谢您的提前帮助

这是我的代码:

Startup.cs

public void ConfigureServices(IServiceCollection services)
    {
        services.Configure<UserDBSettings>(
            Configuration.GetSection(nameof(UserDBSettings)));

        services.AddSingleton<IUserDBSettings>(sp =>
            sp.GetRequiredService<IOptions<UserDBSettings>>().Value); 
            // the line above throws the error and matches this line of code in the guide                                                                             services.AddSingleton<IBookstoreDatabaseSettings>(sp =>
    sp.GetRequiredService<IOptions<BookstoreDatabaseSettings>>().Value);

        services.AddScoped<UserRepository>();

        services.AddControllers();
    }

用户数据库设置

    public class UserDBSettings
{
    public string UserCollectionName { get; set; }
    public string ConnectionString { get; set; }
    public string DataBaseName { get; set; }
}

public interface IUserDBSettings
{
  string UserCollectionName { get; set; }
  string ConnectionString { get; set; }
  string DataBaseName { get; set; }
}

}

然后我的应用程序设置包含连接信息:

{
 "UserDBSettings": {
  "UserCollection": "Users",
  "ConnectionString": "mongodb://connectionAdresss",
  "DatabaseName": "DBName"
 },

您需要将 UserDBSettings 标记为实现 IUserDBSettings 接口(请参阅 docs)否则只有 2 种类型恰好具有相同的属性:

public class UserDBSettings : IUserDBSettings
{
    public string UserCollectionName { get; set; }
    public string ConnectionString { get; set; }
    public string DataBaseName { get; set; }
}

DI 容器要求您正在注册的服务 class 实际实现接口。

public class UserDBSettings : IUserDBSettings
{
    public string UserCollectionName { get; set; }
    public string ConnectionString { get; set; }
    public string DataBaseName { get; set; }
}

正如克里斯所说:

The DI container requires that the service class you are registering actually implement the interface

最佳做法是使用界面。如果有任何原因你不使用接口,你可以试试这个:

services.Configure<UserDBSettings>(
    options => Configuration.GetSection("UserDBSettings").Bind(options));

在您的 class 中,您可以像这样使用它:

public YourConstructor(IOptions<UserDBSettings> userDBSettings)
{
    _userDBSettings = userDBSettings.Value;
}

让我知道它是否适合您;)