给出ConfigureServices
的示例实现:
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<SomeComponent>();
services.AddMvc(config =>
{
config.OutputFormatters.Add(new CustomFormatter(/* HELP! */));
});
}
我需要将SomeComponent
的实例(希望只有一个存在)传递给我的自定义格式化程序的构造函数。如何在ConfigureServices
实现中解决此类实例?
答案 0 :(得分:2)
您可以提前构建服务提供商并使用它:
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<SomeComponent>();
var provider = services.BuildServiceProvider();
var item = provider.GetService<SomeComponent>();
services.AddMvc(config =>
{
config.OutputFormatters.Add(new CustomFormatter(item));
});
}
答案 1 :(得分:1)
我知道有些开发人员将服务定位器模式视为反模式。但有些情况下,它是适合这项工作的正确工具。这可能是其中一种情况。您可以像这样解决您的问题:
public void ConfigureServices(IServiceCollection services,
IHttpContextAccessor contextAccessor)
{
services.AddSingleton<SomeComponent>();
var someComponent = contextAccessor.HttpContext.RequestServices.GetServices<SomeComponent>(); //service locator pattern
services.AddMvc(config =>
{
config.OutputFormatters.Add(new CustomFormatter(someComponent));
});
}
以上示例适用于RC2我注意到在RC1中,关键行有点不同,如下所示:
var someComponent = contextAccessor.HttpContext.ApplicationServices.GetService<SomeComponent>();