【问题标题】:Use method of class without injecting in startup?使用类的方法而不在启动时注入?
【发布时间】:2019-02-12 12:29:00
【问题描述】:

我有一个将生成令牌的服务 ITokenService。我在启动时配置了此服务,例如:

services.AddSingleton<ITokenService, TokenService>();

现在我正在注入另一个需要此令牌进行初始化的自定义提供程序

services.AddScoped<IManagementApiClient>(provider => new ManagementApiClient("token", "YOUR_AUTH0_DOMAIN"));

现在我想将 ITokenService 生成的令牌传递给 ManagementApiClient 初始化中使用的令牌。有没有办法通过创建另一个自定义提供程序或做其他事情来做到这一点。

我已关注此链接https://github.com/auth0/auth0.net/issues/179,但不明白我该怎么做。有什么帮助吗?

【问题讨论】:

    标签: asp.net-core asp.net-core-2.0 auth0


    【解决方案1】:

    您可以在实现工厂委托中从IServiceProvider 解析ITokenService

    services.AddScoped<IManagementApiClient>(provider => 
        new ManagementApiClient(provider.GetRequiredService<ITokenService>().GetToken(), "YOUR_AUTH0_DOMAIN"));
    

    我想知道,为什么你需要一个特定的ITokenService 呢?从配置中检索值还不够吗?例如:

    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }
    
        private IConfiguration Configuration { get; }
    
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddScoped<IManagementApiClient>(new ManagementApiClient(Configuration["Auth0:Token"], Configuration["Auth0:Domain"]);
    
            // ...
        }
    }
    

    您可以在 appsettings.json 中指定这些设置:

    {
      "Auth0": {
        "Domain": "your.domain.auth0.com",
        "Token": "your token"
      }
    }
    

    【讨论】:

    • 问题是令牌将在每 24 小时后过期,如果过期我需要创建新令牌
    • @Ask 查看答案的第一部分。
    • 有没有办法使用await而不是.Result
    • 并非如此。启动代码都是同步的。如果您想异步创建管理 API 客户端,则必须延迟创建它。
    猜你喜欢
    • 1970-01-01
    • 2010-11-12
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多