如何将IOptions传递给ASP.NET 5中间件服务?

时间:2015-09-26 00:02:32

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

我已经开始使用ASP.NET 5 vNext了,我正在努力将config.json中的选项传递给我的WebApi控制器使用的中间件服务。

以下是我的中间件服务的片段:

public class MyService : IMyService 
{
        public MyService(IOptions<MyOptions> settings)
        {
            var o = settings.Options;
        }
}

这是我使用中间件服务的WebApi控制器:

public class MyController : Controller
    {
        private IMyService _myService;

        public TestController(IMyService service)
        {
            _myService = service;
        }
}

在Startup.cs中我正在阅读选项:

services.AddOptions();
services.Configure<MyOptions>(Configuration);

我正在努力的是如何将实例注册到IMyService,以便将其传递给控制器​​的构造函数(如何获取IOptions)?

services.AddInstance<IMyService>(new MyService(XXXXX));

如下所示,我确实试图同时使用

services.AddTransient<MyService>();

services.AddSingleton<MyService>();

但是在这两种情况下我都看到以下错误:

  

处理请求时发生未处理的异常。

     

InvalidOperationException:无法解析类型的服务   &#39; MyApp.Services.IMyService&#39;在尝试激活时   &#39; MyApp.Controllers.TestController&#39 ;.   Microsoft.Framework.DependencyInjection.ActivatorUtilities.GetService(的IServiceProvider   sp,Type type,Type requiredBy,Boolean isDefaultParameterRequired)

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

不要将其注册为实例。相反,只需根据您的要求将其添加为Scoped / Transient / Singleton,让依赖注入尽其所能;

services.Configure<MyOptions>(Configuration.GetSection("MyOptions"));
services.AddScoped<IMyService, MyService>();

答案 1 :(得分:0)

例如,您可以添加到代码为

的Startup.cs
rm(list = ls())
library(shiny)
library(rCharts)

ui <- fluidPage(
  titlePanel("Count Report "),
  h4("This application shows product data"),
  sidebarLayout(
    sidebarPanel(
      selectizeInput("product","Product:",c("ALPHA","BRAVO","all"), selected="all")
    ),
    mainPanel(
      h4("rChart works!"),
      showOutput("chart", "highcharts")

    )
  )
)

server <- function(input, output) {
  x <- data.frame(Category=factor(c("ALPHA", "ALPHA","BRAVO","ALPHA","ALPHA")), 
                  YYYYMM= factor(c("2/1/2015","3/1/2015","4/1/2015","5/1/2015","6/1/2015")),
                  COUNT=c(44,22,37,76,97))

  output$chart <- renderChart2({
    a <- hPlot(COUNT ~ YYYYMM, data=x, type="line") ######### doesnt WORK!
    return (a)
  })
}

shinyApp(ui, server)

我可以向您保证,您可以使用Singleton或Transient。

如果您有兴趣,可以在https://github.com/aspnet/Docs/issues/24找到更多信息。

另外,目前Autofac为ASP.NET 5创建了DI http://alexmg.com/autofac-4-0-alpha-1-for-asp-net-5-0-beta-3/