ASP.Net Core 2无法解析类型的服务

时间:2018-01-31 19:04:05

标签: c# asp.net-core .net-core .net-standard-2.0

我正在尝试注册我自己的自定义选项。在我的ASP.Net项目(Kimble.API)中,我有一个appsettings.json文件。它看起来像这样:

{
    "NotificationHub": {
        "AccountName": "my-notification-hub-name",
        "ConnectionString": "my-secret-connection-string"
    }
}

在API项目引用的.Net标准库(Kimble.Core)中,我有一个类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:'尝试激活'Kimble.API.Controllers.MyController'时无法解析类型'Kimble.Core.Options.NotificationHubOptions'的服务。'

在将NotificationHubOptions课程移到我的核心课程之前,这一切都奏效了。但是,我不明白为什么这根本不重要。

1 个答案:

答案 0 :(得分:2)

您需要注入IOptions<TOptions>,如下所示:

public MyController(IOptions<NotificationHubOptions> options)
{
    _notificationHubOptions = options.Value;
}

当您使用Configure时,您正在注册回调以在创建该类型时为该类型配置选项实例。在这种情况下,使用配置部分将数据绑定到选项对象。

因此选项类本身不在DI中。

如果你想要,你可以这样做:

var options = Configuration.GetSection("NotificationHub").Get<NotificationHubOptions>();
services.AddSingleton<NotificationHubOptions>(options);