64 lines
3.6 KiB
C#
64 lines
3.6 KiB
C#
using Extensions.Hosting.AsyncInitialization;
|
|
using Microsoft.EntityFrameworkCore;
|
|
using Microsoft.Extensions.Configuration;
|
|
using Microsoft.Extensions.DependencyInjection;
|
|
using Microsoft.Extensions.Options;
|
|
using Tnsu.ApprovalRoute.Infrastructure.Persistence;
|
|
using Tnsu.ApprovalRoute.Infrastructure.SharePoint;
|
|
using Tnsu.ApprovalRoute.Infrastructure.TnsuPortal;
|
|
|
|
namespace Tnsu.ApprovalRoute.Infrastructure;
|
|
|
|
public static class InfrastructureServiceCollectionExtensions
|
|
{
|
|
public static IServiceCollection AddApprovalRouteInfrastructure(
|
|
this IServiceCollection services, IConfiguration configuration)
|
|
{
|
|
services.AddHttpContextAccessor();
|
|
|
|
services.AddDbContext<ApprovalRouteDbContext>(opt =>
|
|
opt.UseNpgsql(configuration.GetConnectionString("Postgres"))
|
|
.UseSnakeCaseNamingConvention());
|
|
services.AddAsyncInitializer<DatabaseMigrationInitializer>();
|
|
services.AddScoped<ListPartitioningLock>();
|
|
|
|
services.Configure<SharePointOptions>(configuration.GetSection("SharePoint"));
|
|
// Провайдер сертификата — синглтон: разобранный .pfx кешируется на всё
|
|
// время жизни процесса (см. DbCertificateProvider).
|
|
services.AddSingleton<ICertificateProvider, DbCertificateProvider>();
|
|
services.AddHttpClient<ISharePointClient, SharePointClient>();
|
|
services.AddScoped<ISharePointListProvisioner, SharePointListProvisioner>();
|
|
|
|
services.Configure<TnsuPortalOptions>(configuration.GetSection("TnsuPortal"));
|
|
services.AddHttpClient<TnsuPortalTokenProvider>();
|
|
// Токен вызывающего и общая авторизация запросов к порталу — одни на всех
|
|
// его клиентов (см. TnsuPortalCallerToken/TnsuPortalAuthorizer). Именно
|
|
// Scoped: Hangfire даёт задаче свою область DI, и положенный в задаче токен
|
|
// не должен протекать в соседние.
|
|
services.AddScoped<TnsuPortalCallerToken>();
|
|
services.AddScoped<TnsuPortalAuthorizer>();
|
|
|
|
// Подписка новых списков на уведомления SharePoint. Клиент отдельный от
|
|
// ITnsuPortalClient: там кешируемые чтения справочника, здесь команда.
|
|
// Своих опций нет — адрес приёмника лежит в SharePoint:NotificationUrl.
|
|
services.AddHttpClient<ISharePointWebhookSubscriber, HttpSharePointWebhookSubscriber>((sp, client) =>
|
|
{
|
|
var options = sp.GetRequiredService<IOptions<TnsuPortalOptions>>().Value;
|
|
client.BaseAddress = new Uri(options.BaseUrl);
|
|
});
|
|
// ITnsuPortalClient резолвится в CachingTnsuPortalClient (кеш на 5 минут,
|
|
// см. её комментарий) — сам HttpTnsuPortalClient регистрируем по
|
|
// конкретному типу, а не по интерфейсу, чтобы декоратор мог его получить
|
|
// как обычную зависимость.
|
|
services.AddHttpClient<HttpTnsuPortalClient>((sp, client) =>
|
|
{
|
|
var options = sp.GetRequiredService<IOptions<TnsuPortalOptions>>().Value;
|
|
client.BaseAddress = new Uri(options.BaseUrl);
|
|
});
|
|
services.AddMemoryCache();
|
|
services.AddScoped<ITnsuPortalClient, CachingTnsuPortalClient>();
|
|
|
|
return services;
|
|
}
|
|
}
|