如果我使用 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 ; }
1 回答
喵喵时光机
TA贡献1846条经验 获得超7个赞
第一段代码称为服务定位器反模式,因为在某些情况下您不应该这样做。但是,您问题的答案取决于您未提供的上下文。
在大多数情况下,不,您不应该只注入IServiceProvider. 但是,在某些情况下,您别无选择,只能:即使用单例范围内的事物。如果您有一个单例类型的类、一个IHostedService实现等,除了其他单例范围的服务之外,您不能注入任何东西。如果您需要不同范围内的东西,例如 a DbContext,那么您只能通过注入IServiceProvider和创建范围来获得它:
using (var scope = _serviceProvider.CreateScope())
{
var foo = scope.ServiceProvider.GetRequiredService<Foo>();
// do something with foo;
}
但是,请记住,检索到的实例与作用域相关联。换句话说,当using语句关闭时,它将被处理掉。因此,您需要在该范围内对该实例进行任何操作。你不能做一些事情,比如在你的类上设置一个实例变量,然后尝试使用它,因为你会得到一个ObjectDisposedException.
- 1 回答
- 0 关注
- 169 浏览
添加回答
举报
0/150
提交
取消