在Startup.cs中解析服务是一个服务定位器模式吗?

时间:2017-03-03 12:18:52

标签: design-patterns dependency-injection asp.net-core-mvc inversion-of-control service-locator

我已经阅读了Mark Seemann的Service Locator: roles vs mechanics,我无法做出决定。这是GetRequiredService方法,ConfigureServices方法在Startup.cs中使用(如果我理解正确的话,是composition root),是一个服务定位器:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();

    services.AddScoped<IRepository, MyRepository>();

    services.AddAuthorization(options =>
    {
        var myPolicy = services.BuildServiceProvider()
            .GetRequiredService<IRepository>().GetMyPolicy();

        options.AddPolicy("MyPolicy", policy => policy.AddRequirements(myPolicy));
    });
}

2 个答案:

答案 0 :(得分:3)

正如马克here所解释的那样:

  

封装在Composition Root中的DI容器不是服务定位器 - 它是基础架构组件。

Startup类是Composition Root的一部分。这意味着调用GetRequiredService 不是服务定位器反模式的实现。

答案 1 :(得分:0)

服务定位器不可避免的某些极端情况下。

并非所有框架或库都准备好成为依赖注入链的一部分,因此您需要直接使用IoC容器来定位整个服务。

尽量避免将服务定位器作为实际应用程序代码的一部分,在这些代码中,您将负责在软件架构方面做到最好。