Интерфейс конфигурации ядра .net - PullRequest
1 голос
/ 26 сентября 2019

У меня есть этот файл конфигурации:

public class Config: IDataConfig, IIdentityServerConfig, IStorageConfig
{
    public string ConnectionString { get; set; }
    public string Authority { get; set; }
    public string AzureStorageConnectionString { get; set; }
}

И в одном из моих классов у меня есть это:

public class StorageClient : IStorageClient
{
    private readonly CloudBlobClient _blobClient;

    public StorageClient(IStorageConfig config)
    {
        var storageAccount = CloudStorageAccount.Parse(config.AzureStorageConnectionString);
        _blobClient = storageAccount.CreateCloudBlobClient();
    }

    public CloudBlobContainer GetContainerReference(string name) => _blobClient.GetContainerReference(name);
}

Как вы можете видеть, он ожидает экземпляр IStorageConfig чтобы быть переданным ему.В старые времена вы использовали autofac и регистрировали конфигурацию как все реализованные интерфейсы.

В ядре .net я хотел бы знать, как это сделать.В настоящее время у меня есть это:

public void ConfigureServices(IServiceCollection services)
{
    services.AddCors(m => m.AddPolicy("AllowAll", o => o.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod()));

    services.Configure<Config>(Configuration.GetSection("ConnectionStrings"));
    services.Configure<Config>(Configuration.GetSection("Options"));
    services.Configure<CookiePolicyOptions>(options =>
    {
        // This lambda determines whether user consent for non-essential cookies is needed for a given request.
        options.CheckConsentNeeded = context => true;
        options.MinimumSameSitePolicy = SameSiteMode.None;
    });

    var buildServiceProvider = services.BuildServiceProvider();
    var config = buildServiceProvider.GetService<IOptions<Config>>();

    services.AddTransient(typeof(IGenericService<>), typeof(GenericService<>));
    services.AddTransient<IContainerProvider, ContainerProvider>();

    services.AddSingleton<IComparer, Comparer>();
    services.AddSingleton<IDataTypeFactory, DataTypeFactory>();
    services.AddSingleton<IFilterProvider, FilterProvider>();
    services.AddSingleton<IJsonClient, JsonClient>();
    services.AddSingleton<INumericFactory, NumericFactory>();
    services.AddSingleton<IStorageClient, StorageClient>();
    services.AddSingleton<IStringFactory, StringFactory>();
    services.AddSingleton<IValidator, Validator>();
    services.AddSingleton<HttpClient>();

    services.AddDbContext<DatabaseContext>
        (options => options.UseSqlServer(config.Value.ConnectionString));
    services.AddSwaggerGen(options =>
        {
            options.SwaggerDoc("v1", new Info {Title = "Situ Experience Platform API", Version = "v1"});
            options.IncludeXmlComments($"{System.AppDomain.CurrentDomain.BaseDirectory}\\Api.xml");
        });
    services.AddAuthentication("Bearer")
        .AddIdentityServerAuthentication(options =>
        {
            options.Authority = config.Value.Authority;
            options.RequireHttpsMetadata = false;
            options.ApiName = "Sxp";
        });
    services.AddMvc()
        .ConfigureApiBehaviorOptions(options => { options.SuppressModelStateInvalidFilter = true; });
}

Кто-нибудь знает, как я могу добиться того, что я после?

Вот мой appsettings файл:

{
  "ConnectionStrings": {
    "ConnectionString": "Server=localhost;Database=sxp_master;Trusted_Connection=True;",
    "Storage": "DefaultEndpointsProtocol=https;AccountName=sxp;AccountKey=moo"
  },
  "Options": {
    "Authority": "https://localhost:44362"
  },
  "Logging": {
    "Debug": {
      "LogLevel": {
        "Default": "Information"
      }
    },
    "Console": {
      "IncludeScopes": false,
      "LogLevel": {
        "Microsoft.AspNetCore.Mvc.Razor.Internal": "Warning",
        "Microsoft.AspNetCore.Mvc.Razor.Razor": "Debug",
        "Microsoft.AspNetCore.Mvc.Razor": "Error",
        "Default": "Information"
      }
    },
    "LogLevel": {
      "Default": "Debug"
    }
  },
  "AllowedHosts": "*"
}

1 Ответ

1 голос
/ 26 сентября 2019

Следующее допущение основано на определении и использовании класса Config в исходном примере

public interface IDataConfig {
    string ConnectionString { get; set; }
}

public interface IIdentityServerConfig {
    string Authority { get; set; }
}

public interface IStorageConfig {
    string AzureStorageConnectionString { get; set; }
}

Так дано

public class Config: IDataConfig, IIdentityServerConfig, IStorageConfig {
    public string ConnectionString { get; set; }
    public string Authority { get; set; }
    public string AzureStorageConnectionString { get; set; }
}

Этот тип требует, чтобы каждый интерфейс былзарегистрирован.

services.AddCors(m => m.AddPolicy("AllowAll", o => 
    o.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod()));

services.Configure<Config>(Configuration.GetSection("ConnectionStrings"));
services.Configure<Config>(Configuration.GetSection("Options"));
services.Configure<CookiePolicyOptions>(options =>
{
    // This lambda determines whether user consent for 
    // non-essential cookies is needed for a given request.
    options.CheckConsentNeeded = context => true;
    options.MinimumSameSitePolicy = SameSiteMode.None;
});

//register the individual interfaces, extracting the registered IOptions<Config>
services.AddSingleton<IDataConfig>(sp => sp.GetRequiredService<IOptions<Config>>().Value);
services.AddSingleton<IIdentityServerConfig>(sp => sp.GetRequiredService<IOptions<Config>>().Value);
services.AddSingleton<IStorageConfig>(sp => sp.GetRequiredService<IOptions<Config>>().Value);

//...omitted for brevity

На самом деле не должно быть никакой необходимости вручную создавать поставщика услуг в Startup, но для вашего примера к поставщику можно обратиться для регистрации DbContext, используя следующую команду AddDbContextперегрузка , которая откладывает вызов и получает доступ к IServiceProvider.

//...

services.AddDbContext<DatabaseContext>((serviceProvider, options) => 
    options.UseSqlServer(serviceProvider.GetRequiredService<IDataConfig>().ConnectionString)
);

//...
...