如果使用ServiceProvider接口解析.NET Core中的属性以进行依赖注入,这很不好吗
让我说以下
private readonly IRecipeRepository _recipeRepository;
private readonly IMediaResource _resourceUpload;
private readonly IAWSMedia _awsMedia;
然后执行
public RecipeService(IServiceProvider service)
{
_recipeRepository = service.GetService<IRecipeRepository>();
_resourceUpload = service.GetService<IMediaResource>();
_awsMedia = service.GetService<IAWSMedia>();
}
代替此
public RecipeService(IRecipeRepository recipeRepo, IMediaResource media, IAWSMedia awsMedia )
{
_recipeRepository = recipeRepo;
_resourceUpload = media;
_awsMedia = awsMedia ;
}
答案 0 :(得分:2)
代码的第一位称为服务定位器 anti 模式,就像您不应该做的那样。但是,问题的答案取决于您未提供的上下文。
在大多数情况下,不,您不应该只注入IServiceProvider
。但是,在某些情况下,您别无选择,只能:在单例范围内进行操作。如果您具有单例类型的类,IHostedService
实现等,则只能注入其他单例作用域的服务。如果您需要其他范围内的东西,例如DbContext
,则只能通过注入IServiceProvider
并创建范围来实现:
using (var scope = _serviceProvider.CreateScope())
{
var foo = scope.ServiceProvider.GetRequiredService<Foo>();
// do something with foo;
}
但是,请记住,检索到的实例与作用域相关。换句话说,当using
语句关闭时,它将被处置。因此,您需要对该实例 inside 在该范围内进行任何工作。您将无法执行诸如在类上设置实例变量以及稍后尝试使用它的操作,因为这样您将获得ObjectDisposedException
。