Как я могу добавить службы внутри моей службы, перенаправляющей IOptions? - PullRequest
0 голосов
/ 17 июня 2020

Я создаю свой собственный пакет, чтобы отвлечь пользователя от некоторых вещей.

Мой оригинал Startup.cs выглядел как

 services.AddAuthentication(options =>
            {
                // Store the session to cookies
                options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;

                // OpenId authentication
                options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
            })
         .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme)
         .AddOpenIdConnect(o =>
            {
                // URL of the Keycloak server
                o.Authority = Configuration["Jwt:Authority"];

                // Client configured in the Keycloak
                o.ClientId = Configuration["Jwt:ClientId"];

                ...
             }

Я хочу извлечь эти методы Add * в мой собственный пакет вроде этого:

    public static class MyExtension 
    {
        public static IServiceCollection AddMyAuthentication(this IServiceCollection services)
        {
            // Add ASP.NET Core Options libraries - needed so we can use IOptions<SVOSOptions>
            services.AddOptions();

            services.AddAuthentication(options =>
            {
                // Store the session to cookies
                options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;

                // OpenId authentication
                options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
            })
            .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme)
            .AddOpenIdConnect(o =>
            {
                // URL of the Keycloak server
                o.Authority = * MyOptions.Authority *;

                // Client configured in the Keycloak
                o.ClientId = * MyOptions.ClientId *

                ...

            });


            return services;
        }

        public static IServiceCollection AddMyAuthentication(this IServiceCollection services, Action<MyOptions> configure)
        {
            if (services == null)
            {
                throw new ArgumentNullException(nameof(services));
            }

            if (configure != null)
            {
                services.Configure(configure);
            }

            return services.AddMyAuthentication();
        }
    }

Конечно, я хочу заменить все вызовы Configuration [] в моем классе некоторыми параметрами, которые я хочу отправить из моего нового Startup.cs, например:

services.AddMyAuthentication(options => {
       options.Authority = Configuration["Jwt:Authority"];
       options.ClientId = Configuration["Jwt:ClientId"];
})

Я также делаю это, потому что хочу жестко запрограммировать, что пользователю не нужно знать. Я надеюсь, что это правильный способ сделать что-то подобное.

1 Ответ

0 голосов
/ 17 июня 2020

Если вы просто используете результирующие настройки во время регистрации службы и вам не нужно регистрировать эти параметры в поставщике услуг для последующего внедрения, вы, вероятно, можете просто передать их как строго типизированный POCO в свою статистику. c, которое добавит ясности в отношении требуемых входящих параметров.

public class MyAuthenticationOptions
{
   public string Authority { get; set; }
   public string ClientId { get; set; }
}

, а затем используйте Microsoft.Extensions.Configuration.Binder для привязки к экземпляру:

// Replace the quoted section with your config section 
services.AddMyAuthentication(Configuration.GetSection("MyAuthenticationOptions").Get<MyAuthenticationOptions>();

И, наконец, обновите метод расширения, чтобы он принял объект:

 public static IServiceCollectionAddMyAuthentication(this IServiceCollection services, MyAuthenticationOptions options); //...
...