如果我使用ServiceProvider接口解析.NET Core中的属性以进行依赖注入,这是否不好?

时间:2018-08-09 06:56:35

标签: c# .net asp.net-core dependency-injection .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 ;
    }

1 个答案:

答案 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