myhn/Infrastructure/ServiceCollectionExtensions.cs
2021-01-15 20:37:27 +01:00

71 lines
2.2 KiB
C#

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using MyHN.Application;
using MyHN.Domain;
using MediatR;
using MyHN.Infrastructure.Repositories;
using System;
namespace MyHN.Infrastructure
{
public class MyHNServicesBuilder
{
private readonly IServiceCollection _services;
public MyHNServicesBuilder(IServiceCollection services)
{
_services = services;
}
/// <summary>
/// Enregistre un service pour fournir l'utilisateur connecté à la plateforme.
/// </summary>
/// <typeparam name="TUserProvider"></typeparam>
public void AddUserProvider<TUserProvider>()
where TUserProvider : class, IUserProvider
{
_services.AddScoped<IUserProvider, TUserProvider>();
}
}
public static class ServiceCollectionExtensions
{
/// <summary>
/// Ajoute les services nécessaires à la gestion de la plateforme de liens.
/// </summary>
/// <param name="services"></param>
/// <param name="configuration"></param>
/// <returns></returns>
public static MyHNServicesBuilder AddMyHNServices(
this IServiceCollection services
, IConfiguration configuration)
{
services.AddDbContext<MyHNDbContext>(options =>
options.UseSqlite(configuration.GetOrParseConnectionString()));
services.AddScoped<ILinkRepository, LinkRepository>();
services.AddScoped<ICommentRepository, CommentRepository>();
services.AddScoped<IContext, MyHNDbContext>();
services.AddMediatR(typeof(CreateLinkCommand));
return new MyHNServicesBuilder(services);
}
private static string GetOrParseConnectionString(this IConfiguration configuration)
{
// Since it will be defined as an uri from heroku...
var envVar = Environment.GetEnvironmentVariable("DATABASE_URL");
if (string.IsNullOrWhiteSpace(envVar))
{
return configuration.GetConnectionString("Default");
}
var uri = new Uri(envVar);
var userInfo = uri.UserInfo.Split(':');
return $"Host={uri.Host};Port={uri.Port};Database={uri.AbsolutePath.Substring(1)};Username={userInfo[0]};Password={userInfo[1]}";
}
}
}