为了账号安全,请及时绑定邮箱和手机立即绑定

如果我使用 ServiceProvider 接口来解析我在 .NET Core 中的属性进行依赖

如果我使用 ServiceProvider 接口来解析我在 .NET Core 中的属性进行依赖

C#
素胚勾勒不出你 2021-11-21 14:49:14
如果我使用 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.


查看完整回答
反对 回复 2021-11-21
  • 1 回答
  • 0 关注
  • 169 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信