我已经阅读了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));
});
}
答案 0 :(得分:3)
正如马克here所解释的那样:
封装在Composition Root中的DI容器不是服务定位器 - 它是基础架构组件。
Startup
类是Composition Root的一部分。这意味着调用GetRequiredService
不是服务定位器反模式的实现。
答案 1 :(得分:0)
在服务定位器不可避免的某些极端情况下。
并非所有框架或库都准备好成为依赖注入链的一部分,因此您需要直接使用IoC容器来定位整个服务。
尽量避免将服务定位器作为实际应用程序代码的一部分,在这些代码中,您将负责在软件架构方面做到最好。