如果我使用 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 ;

    }


素胚勾勒不出你
浏览 170回答 1
1回答

喵喵时光机

第一段代码称为服务定位器反模式,因为在某些情况下您不应该这样做。但是,您问题的答案取决于您未提供的上下文。在大多数情况下,不,您不应该只注入IServiceProvider. 但是,在某些情况下,您别无选择,只能:即使用单例范围内的事物。如果您有一个单例类型的类、一个IHostedService实现等,除了其他单例范围的服务之外,您不能注入任何东西。如果您需要不同范围内的东西,例如 a DbContext,那么您只能通过注入IServiceProvider和创建范围来获得它:using (var scope = _serviceProvider.CreateScope()){&nbsp; &nbsp; var foo = scope.ServiceProvider.GetRequiredService<Foo>();&nbsp; &nbsp; // do something with foo;}但是,请记住,检索到的实例与作用域相关联。换句话说,当using语句关闭时,它将被处理掉。因此,您需要在该范围内对该实例进行任何操作。你不能做一些事情,比如在你的类上设置一个实例变量,然后尝试使用它,因为你会得到一个ObjectDisposedException.
打开App,查看更多内容
随时随地看视频慕课网APP