ASP.Net 核心 2 无法解析服务类型
ASP.Net Core 2 Unable to resolve service for type
我正在尝试注册我自己的自定义选项。在我的 ASP.Net 项目 (Kimble.API) 中,我有一个 appsettings.json
文件。它看起来像这样:
{
"NotificationHub": {
"AccountName": "my-notification-hub-name",
"ConnectionString": "my-secret-connection-string"
}
}
在 API 项目引用的我的 .Net 标准库 (Kimble.Core) 中,我有一个 class NotificationHubOptions
:
public class NotificationHubOptions
{
public string AccountName { get; set; }
public string ConnectionString { get; set; }
}
返回 API 项目。
在我的 Startup.cs
文件中,在 ConfigureServices
方法中,我注册了选项:
services.Configure<NotificationHubOptions>(configuration.GetSection("NotificationHub"));
我已经检查过了,注册确实出现在 services
集合中。
我的控制器的构造函数如下所示:
public MyController(NotificationHubOptions options)
{
_notificationHubOptions = options;
}
然而,当我尝试调用控制器上的方法时,我总是得到一个异常:
System.InvalidOperationException: 'Unable to resolve service for type 'Kimble.Core.Options.NotificationHubOptions' while attempting to activate 'Kimble.API.Controllers.MyController'.'
在我将 NotificationHubOptions
class 移动到我的核心项目之前,这一切都有效。但是,我不明白为什么这很重要。
你需要注入IOptions<TOptions>
,像这样:
public MyController(IOptions<NotificationHubOptions> options)
{
_notificationHubOptions = options.Value;
}
当您使用 Configure
时,您正在注册回调以在创建该类型时为其配置选项实例。在这种情况下,使用配置部分将数据绑定到选项对象。
所以选项 class 本身不在 DI 中。
如果你想要,你可以这样做:
var options = Configuration.GetSection("NotificationHub").Get<NotificationHubOptions>();
services.AddSingleton<NotificationHubOptions>(options);
我正在尝试注册我自己的自定义选项。在我的 ASP.Net 项目 (Kimble.API) 中,我有一个 appsettings.json
文件。它看起来像这样:
{
"NotificationHub": {
"AccountName": "my-notification-hub-name",
"ConnectionString": "my-secret-connection-string"
}
}
在 API 项目引用的我的 .Net 标准库 (Kimble.Core) 中,我有一个 class NotificationHubOptions
:
public class NotificationHubOptions
{
public string AccountName { get; set; }
public string ConnectionString { get; set; }
}
返回 API 项目。
在我的 Startup.cs
文件中,在 ConfigureServices
方法中,我注册了选项:
services.Configure<NotificationHubOptions>(configuration.GetSection("NotificationHub"));
我已经检查过了,注册确实出现在 services
集合中。
我的控制器的构造函数如下所示:
public MyController(NotificationHubOptions options)
{
_notificationHubOptions = options;
}
然而,当我尝试调用控制器上的方法时,我总是得到一个异常:
System.InvalidOperationException: 'Unable to resolve service for type 'Kimble.Core.Options.NotificationHubOptions' while attempting to activate 'Kimble.API.Controllers.MyController'.'
在我将 NotificationHubOptions
class 移动到我的核心项目之前,这一切都有效。但是,我不明白为什么这很重要。
你需要注入IOptions<TOptions>
,像这样:
public MyController(IOptions<NotificationHubOptions> options)
{
_notificationHubOptions = options.Value;
}
当您使用 Configure
时,您正在注册回调以在创建该类型时为其配置选项实例。在这种情况下,使用配置部分将数据绑定到选项对象。
所以选项 class 本身不在 DI 中。
如果你想要,你可以这样做:
var options = Configuration.GetSection("NotificationHub").Get<NotificationHubOptions>();
services.AddSingleton<NotificationHubOptions>(options);