首页 > 解决方案 > 如果我使用 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 ;
    }

标签: c#.netasp.net-coredependency-injection.net-core

解决方案


第一段代码称为服务定位器模式,就像你不应该的那样。但是,您的问题的答案取决于您未提供的上下文。

在大多数情况下,不,您不应该只注入IServiceProvider. 但是,在某些情况下,您别无选择,只能:即使用单例范围内的事物。如果你有一个单例类型的类、一个IHostedService实现等,除了其他单例范围的服务之外,你不能注入任何东西。如果您需要像 a 这样的不同范围内的东西DbContext,那么您只能通过注入IServiceProvider和创建一个范围来获得它:

using (var scope = _serviceProvider.CreateScope())
{
    var foo = scope.ServiceProvider.GetRequiredService<Foo>();
    // do something with foo;
}

但是,请记住,检索到的实例与范围相关联。换句话说,当using语句关闭时,它将被处置。因此,您需要在该范围内对该实例进行任何操作。你不能做一些事情,比如在你的类上设置一个实例变量,然后再尝试使用它,因为你会得到一个ObjectDisposedException.


推荐阅读