c# - 如果我使用 ServiceProvider 接口来解析我在 .NET Core 中的属性以进行依赖注入,会不会很糟糕
问题描述
如果我使用 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 ;
}
解决方案
第一段代码称为服务定位器反模式,就像你不应该做的那样。但是,您的问题的答案取决于您未提供的上下文。
在大多数情况下,不,您不应该只注入IServiceProvider
. 但是,在某些情况下,您别无选择,只能:即使用单例范围内的事物。如果你有一个单例类型的类、一个IHostedService
实现等,除了其他单例范围的服务之外,你不能注入任何东西。如果您需要像 a 这样的不同范围内的东西DbContext
,那么您只能通过注入IServiceProvider
和创建一个范围来获得它:
using (var scope = _serviceProvider.CreateScope())
{
var foo = scope.ServiceProvider.GetRequiredService<Foo>();
// do something with foo;
}
但是,请记住,检索到的实例与范围相关联。换句话说,当using
语句关闭时,它将被处置。因此,您需要在该范围内对该实例进行任何操作。你不能做一些事情,比如在你的类上设置一个实例变量,然后再尝试使用它,因为你会得到一个ObjectDisposedException
.
推荐阅读
- jquery - 如果大于 1,则以数组格式显示数据层
- python-3.6 - 如何将列表添加到字典中作为python中的键值
- javascript - 数据表标题不响应模式
- .net - COPY_FILE_NO_BUFFERING 标志的“大”文件是什么?
- javascript - 大数据集问题的强制布局气泡图
- mysql - 如何将 Web 服务连接和配置到 Soap UI、Mysql Workbench、Web 服务服务器 All Together
- ios - 如何在 swift5 和 Alamofire 5 beta 版本中获取和保存响应?
- javascript - 是否可以使用顶点代码打开 Outlook 邮件并将 HTML 文本从 Salesforce 对象字段导入邮件正文?
- xamarin - 更改列表视图单元格的背景颜色在运行时不起作用
- android - 如何使用 itemTouchHelper RecyclerView 为滑动菜单绘制三个按钮?