【发布时间】:2017-03-03 12:18:51
【问题描述】:
我已阅读 Mark Seemann 的 Service Locator: roles vs mechanics,但我无法决定什么。这是GetRequiredService 方法,它用于Startup.cs 中的ConfigureServices 方法(如果我理解正确的话,就是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));
});
}
【问题讨论】:
-
这篇文章是DI Friendly Framework。一个框架通常必须提供至少一个扩展点(通常是一个抽象工厂),容器可以在其中注入组合根内部,否则它不会知道有关最终用户组件的任何信息。这不是服务定位器 - 它是与任何类型的框架集成的现实。
-
这里的大警告:您在调用
BuildServiceProvider时应该非常小心,因为这会强制创建一个具有自己的单例集的不同容器实例。这可能会导致非常奇怪的行为并且难以追踪错误。相反,更喜欢在AddAuthorization委托中手动创建MyRepository。 -
@Steven:我实际上使用 SimpleInjector 我将使用它进行服务解析,我只是使用本机 .NET 容器作为示例。不过感谢您的警告。
标签: design-patterns dependency-injection asp.net-core-mvc inversion-of-control service-locator