如何在ConfigureServices期间解决依赖关系?

时间:2016-05-20 14:43:26

标签: asp.net-core-mvc

给出ConfigureServices的示例实现:

public void ConfigureServices(IServiceCollection services)
{           
    services.AddSingleton<SomeComponent>();

    services.AddMvc(config =>
    {
        config.OutputFormatters.Add(new CustomFormatter(/* HELP! */));
    });
}

我需要将SomeComponent的实例(希望只有一个存在)传递给我的自定义格式化程序的构造函数。如何在ConfigureServices实现中解决此类实例?

2 个答案:

答案 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>();