【问题标题】:.net core DI injection duplicated singleton service for BuildServiceProvideBuildServiceProvide 的 .net 核心 DI 注入重复单例服务
【发布时间】:2020-11-05 14:16:29
【问题描述】:

我想删除 BuildServiceProvider 方法的重复单例服务。我知道我应该使用现有的 DI 服务,但我无法访问 GetService 方法。我是 DI 的新手,如果有人能说出如何在不获取新服务的情况下访问 GetService 方法,我将不胜感激。代码如下。谢谢。

MESSAGE:从应用程序代码中调用“BuildServiceProvider”会导致创建一个额外的单例服务副本。考虑将依赖注入服务等替代方案作为“配置”的参数。

public void ConfigureServices(IServiceCollection services){

services.AddAuthorization(options =>
      {
        var sp = services.BuildServiceProvider();//CODE ISSUE HERE
        var permissionService = sp.GetService<IPermissionService>();
        if (permissionService != null)
        {
          foreach (var permission in permissionService.GetPrivilegePermissions().Select(x => x.Name)
                   .Distinct())
          {

            options.AddPolicy(permission, policy => policy.Requirements.Add(new 
 PermissionRequirement(permission)));

          }

        }

      });

 

}

【问题讨论】:

    标签: c# .net-core dependency-injection


    【解决方案1】:

    您已经编写了一个 lambda 方法来配置一个对象。但是,由于所有 Microsoft 服务都遵循 options 模式,因此您可以改为编写一个服务来配置它。注入您想要的任何其他服务。您可以为任何选项类型实现任意数量的IConfigureOptions&lt;T&gt; 服务。

    public class ConfigureAuthorization : IConfigureOptions<AuthorizationOptions>{
        public ConfigureAuthorization( ... ){}
    
        public void Configure(AuthorizationOptions options){
            // ...
        }
    }
    
    services.AddAuthorization();
    services.AddSingleton<IConfigureOptions<AuthorizationOptions>, ConfigureAuthorization>();
    

    注意,注意任何潜在的scoping 问题。

    【讨论】:

    • 感谢您的回答,但我认为我没有正确遵循您的代码。这是在 Startup 页面上,我同时拥有 ConfigureServices 和 Configure 方法,它们使用选项模式注册了一堆其他服务。这如何适合现有代码?我已经尝试编写一个辅助类 ConfigureAuthorization 无法让它工作。希望这样的东西 - link - 留在 ConfigureService 方法中。
    • 我不认为你可以在方法中定义一个类。但是你可以在另一个类中定义一个类,或者在同一个文件中并排定义多个类。
    猜你喜欢
    • 2021-03-21
    • 2019-01-31
    • 2018-05-08
    • 2022-11-11
    • 2020-01-17
    • 1970-01-01
    • 2019-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多