我在AspNet Core 1.1应用程序中使用Options模式。一切都根据文档设置:
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables();
Configuration = builder.Build();
}
public void ConfigureServices(IServiceCollection services)
{
...
services.Configure<AppOptions>(Configuration);
...
}
我想将AppOptions类注入我正在创建的服务中:
public class MyService
{
private readonly AppOptions options;
public MyService(IOptions<AppOptions> optionsAssesor)
{
options = optionsAssesor.Value;
}
...
}
我的问题是:当我尝试创建MyService类的实例时:
MyService svc = new MyService();
我收到一条错误消息,指出没有给出与所需形式参数选项相对应的参数Assesor 如何利用DI并将AppOptions注入我的服务?
我是.NET Core的新手,所以我猜我错过了一些简单的东西,但我无法弄清楚是什么。
谢谢。
答案 0 :(得分:2)
我假设Service(MyService)在ASP.net核心项目的范围内。
你必须做以下事情。
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<MyService>();
... other things
}
现在假设您正在使用您的服务(或者您想要使用您的服务某些控制器,那么您必须这样做
public class HomeController : Controller
{
private MyService _myService = null;
public HomeController(MyService service)
{
_myService = service;
}
// now you can use _myService in your controller method.
}
像你这样的事情必须经历依赖。
更新1
现在假设您想在另一个类中使用它,那么您可以这样做。
例如,另一个类是MyClass1。
public class MyClass1
{
private MyService _myService = null;
public MyClass1(MyService service)
{
_myService = service;
}
}
现在,如果我的想法是正确的,那么如果你使用的是ASP.net核心,那么MyClass1将由Controller使用。你必须为此注册依赖。
services.AddScoped<MyClass1>(); // This should be in your ConfigureServices.
答案 1 :(得分:1)
这取决于您尝试从哪里获取MyService实例。基本上你需要获得对服务集合的引用(并在启动时在DI中注册MyService),构建服务提供者,然后获得服务。这将允许DI构造MyService的实例并将其传递给AppOptions的实例。
例如:
var provider = serviceCollection.BuildServiceProvider();
var myService = provider.GetService<MyService>();
话虽如此,在ASP.NET Core的大多数地方你都不需要这样做,最好通过Controller / Middleware构造函数获取MyService实例,而不必自己构建服务提供者。 / p>
您应该查看ASP.NET核心中的Microsoft Docs on Dependency Injection,以进一步了解不同的服务生命周期。