【发布时间】:2016-10-17 08:22:51
【问题描述】:
如何正确激活使用 ServiceCollection.Configure 函数添加的配置?
public static void Main(args[] args)
{
serviceCollection = new ServiceCollection();
serviceCollection .Configure<MyOptions>(Configuration.GetSection("options"));
Services = serviceCollection.BuildServiceProvider();
ActivatorUtilities.CreateInstance<MyOptions>(Services);
ActivatorUtilities.CreateInstance<SomeClassThatNeedsoptions>(Services);
}
public SomeClassThatNeedsoptions(IOptions<MyOptions> options)
{
_options = options.Value;
}
在第二个 ActivatorUtilities.CreateInstance 我收到以下错误
无法解析类型“Microsoft.Extensions.Options.IOptions [MyOptions]`的服务
我正在控制台应用程序中编写此代码,据我所知,我正在使用 ActivatorUtilities 类手动注入依赖项。我似乎可以使用 AddSingleton 添加的服务来做到这一点,但不能使用 .Configure 添加的服务来完成
【问题讨论】:
-
您的问题有点混乱/不清楚。您在 main 方法中创建
ServiceCollection()并从中构建服务提供者(您在控制台应用程序中执行此操作),但您的问题被标记为 ASP.NET Core。现在是什么?控制台还是 ASP.NET Core?在 ASP.NET 核心中,您可以通过 Startup.cs 和ConfigureServices/Configure方法完成此操作 -
第二,为什么使用ActivatorUtilities而不是通过
Services.GetService<T>()解析? -
嗨 tseng,很抱歉造成混乱,我真的是 aspnetcore 的新手。这是一个使用 aspnetcore ioc 的控制台应用程序。我认为激活实用程序用于将服务注入类(构造函数注入),而不是传递服务提供者。
-
在这里查看我的答案,stackoverflow.com/a/39605743/455493。虽然它是关于没有端点的微服务(这实际上使它成为一个普通的控制台后台服务),但它展示了如何“引导”一个控制台应用程序。基本上你有一个类,它启动你的应用程序并注入所需的服务来完成工作。从那里一切都应该由 IoC 解决(通过构造函数注入或工厂模式)。在我的示例中,
MyHost将是您的类,它会依赖于可以依赖于自己的东西等。 -
另外,
Microsoft.Extension.DependencyInjection并不特定或仅限于 ASP.NET Core,可以在没有 ASP.NET Core 的情况下使用(即 Microsoft Orleans 也使用它)
标签: c# dependency-injection asp.net-core asp.net-core-1.0