using System;
using Application;
using Domain;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
namespace Infrastructure
{
public static class ServiceCollectionExtensions
{
///
/// Ajout des services pour la gestion de notre domaine fonctionnel avec les implémentations
/// à base d'Entity Framework Core.
///
///
///
public static IServiceCollection AddHNServicesEF(this IServiceCollection services)
{
services.AddDbContext((provider, options) =>
{
var configuration = provider.GetRequiredService();
// configuration["ConnectionStrings:Default"]
options.UseSqlite(configuration.GetConnectionString("Default"));
});
services.AddScoped();
services.AddScoped();
services.AddScoped();
return services.AddCommon();
}
///
/// Ajout des services pour la gestion de notre domaine fonctionnel avec les implémentations
/// en mémoire, parfait pour des tests.
///
///
///
public static IServiceCollection AddHNServicesInMemory(this IServiceCollection services)
{
var uid = Guid.NewGuid();
var link1 = new Domain.Link(uid, "http://default.website");
var link2 = new Domain.Link(uid, "http://another.website");
var link3 = new Domain.Link(uid, "http://a.final.website");
services.AddSingleton(new Infrastructure.Repositories.Memory.LinkRepository(
link1,
link2,
link3
));
services.AddSingleton(new Infrastructure.Repositories.Memory.CommentRepository(
link1.AddComment(uid, "my first comment"),
link3.AddComment(uid, "another comment")
));
services.AddSingleton(serviceProvider =>
{
var memoryLinkRepository = serviceProvider.GetRequiredService() as Infrastructure.Repositories.Memory.LinkRepository;
var memoryCommentRepository = serviceProvider.GetRequiredService() as Infrastructure.Repositories.Memory.CommentRepository;
return new Infrastructure.Repositories.Memory.Data(memoryLinkRepository, memoryCommentRepository);
});
return services.AddCommon();
}
///
/// Ajout des services communs peu importe la persistance choisie.
///
///
///
private static IServiceCollection AddCommon(this IServiceCollection services)
{
services.AddScoped();
services.AddTransient();
services.AddTransient();
return services;
}
}
}