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;
}
让我知道它是否适合您;)
我正在学习如何将 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;
}
让我知道它是否适合您;)