在Controller asp.net-core v1.1.0外部使用依赖注入进行应用程序设置

时间:2016-12-21 03:06:42

标签: c# asp.net-core asp.net-core-mvc

我正在使用asp.net-core v1.1.0:)

我想从服务类而不是从控制器访问应用程序设置值,我的代码是:

appsettings.json

// appsettings.json
{
  "ImagesDBSettings": {
    "Endpoint": "",
    "Key": "",
  }
}

Startup.cs

// Startup.cs
...
public void ConfigureServices(IServiceCollection services)
{
    ...
    services.AddOptions();
    services.Configure<ImagesDBSettings>(Configuration.GetSection("ImagesDBSettings"));
    ...
}
...

ImagesDBSettings.cs

// ImagesDBSettings.cs
public class ImagesDBSettings
{
    public string Endpoint { get; set; }
    public string Key { get; set; }
}

ImagesDBService.cs

// ImagesDBService.cs
public class ImagesDBService
{
    private readonly ImagesDBSettings _settings;
    public ImagesDBService(IOptions<ImagesDBSettings> settings)
    {
        _settings = settings.Value;
    }
}

编译时我收到错误:

  

没有任何论据符合所需的形式参数&#39;设置&#39; of&#39; ImagesDBService.ImagesDBService(IOptions)&#39;

关于如何使依赖注入工作的任何想法?

2 个答案:

答案 0 :(得分:3)

不会使用显示的代码将IOptions依赖注入到ImagesDBService中。你需要在startup.cs中使用AddTransient。对于DI外部控制器,请参阅此question。或者,您可以从控制器向服务类传递IOptions(不是最佳选项)。

public IActionResult Index(IOptions<ImagesDBSettings> settings)
{
    ImagesDBService ss = new ImagesDBService(settings);
    return View();
}

以下是我在没有DI的应用中的表现。我有一个静态AppSettings类,我在ConfigureServices(startup.cs)中配置。然后,我只需在应用程序的任何位置访问我的AppSettings。

public static class AppSettings
{
    public static string ConnectionString { get; set; }        
}

Startup.cs:

public void ConfigureServices(IServiceCollection services)
{
    AppSettings.ConnectionString = Configuration.GetConnectionString("DefaultConnection");
}

答案 1 :(得分:0)

你说这是一个编译错误所以可能与DI无关,你更有可能错过了IOptions<>命名空间。

如果您还没有这样做,请安装包:Microsoft.Extensions.Options.ConfigurationExtensions from Nuget.

然后将名称空间Microsoft​.Extensions​.Options引用到您的班级ImagesDBService