【问题标题】:.Net core 2 web api not injecting configuration into service.Net core 2 web api没有将配置注入服务
【发布时间】:2018-07-27 20:45:41
【问题描述】:

由于某种我无法确定的原因,DI 无法在我的 .Net core 2 web api 中使用配置。代码如下:

程序.cs:

public class Program
{
    public static void Main(string[] args)
    {
        BuildWebHost(args).Run();
    }

    public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .Build();
}

Startup.cs:

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();

        services.AddSingleton<IMyService, MyService>();
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseMvc();
    }
}

我的控制器:

public class MyController : Controller
{
    private readonly IMyService service;

    public MyController(IMyService service)
    {
        this.service = service;
    }

    [HttpGet]
    public IActionResult Get()
    {
        return Ok(service.MyMethod());
    }
}

我的服务:

public class MyService : IMyService
{
    private readonly IConfiguration config;

    public MyService(IConfiguration config)
    {
        this.config = config;
    }

    public string MyMethod()
    {
        var test = config["MySetting"]; // <-- Breaks here. config is null.
    }
}

我已经阅读了配置文档 here 和 SO 帖子 like this one,但似乎无法弄清楚为什么 DI 不适合我。有什么想法吗?我错过了什么?谢谢!

【问题讨论】:

  • 抱歉,我在发布答案时误读了您的初始配置。在您调用MyMethod() 的地方,您的控制器和构造函数是什么样的?
  • 别担心,感谢您抽出宝贵时间帮助我。我用控制器代码更新了我的帖子。
  • 你说的不工作是什么意思?如果是,抛出了什么异常?
  • 看来您也需要注册IConfiguration 服务:services.AddSingleton&lt;IConfiguration&gt;(Configuration);
  • @Fabio,空指针异常。在 MyService.cs 代码 sn-p 中查看我的评论。

标签: c# dependency-injection .net-core asp.net-core-2.0 asp.net-core-webapi


【解决方案1】:

看起来您需要在 Startup.cs 中的 ConfigureServices 中添加一行:

services.AddSingleton<IConfiguration>(Configuration);

这是一个完整的例子:https://blogs.technet.microsoft.com/dariuszporowski/tip-of-the-week-how-to-access-configuration-from-controller-in-asp-net-core-2-0/

【讨论】:

  • 我实际上已经尝试过了,但没有成功 :( 我使用了here 描述的选项模式,这对我有用。
  • 不是必要的。在 ASP.NET Core 2 中,配置通过 WebHostBuilder 移至 DI,因此配置对象已注册为单例。这就是Startup 类使用 DI 获取配置对象的方式。
  • 这真的有效!
【解决方案2】:

这对我来说效果很好。

如果您需要将“MySettings”部分添加到 DI,请创建您的配置模型类 MySettingsConfiguration 并将其添加到 Startup.cs

services.Configure<MySettingsConfiguration>(Configuration.GetSection("MySettings"));

这可以稍后在您的构造函数中使用,或者通过范围服务使用

public MyService(IOptionsSnapshot<MySettingsConfiguration> mySettingsConfiguration) { }

或使用单例服务

public MyService(IOptions<MySettingsConfiguration> mySettingsConfiguration) { }

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-19
    • 2018-03-24
    • 1970-01-01
    • 1970-01-01
    • 2020-02-05
    • 2021-03-22
    相关资源
    最近更新 更多