Añadiendo Cadre de Entidades para Posts de Blog (Part 2) (Español (Spanish))

Añadiendo Cadre de Entidades para Posts de Blog (Part 2)

Thursday, 15 August 2024

//

7 minute read

Puede encontrar todos los códigos de fuente para los post del blog en GitHub

La Comisión Consultiva en Asuntos Administrativos y de Presupuesto recomienda a la Asamblea General que apruebe el siguiente proyecto de presupuesto por programas para el bienio 2008-2009: Se puede encontrar la parte 1 a) Adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre hombres y mujeres en todos los ámbitos de la vida, incluida la educación;.

El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer.

En el anterior post, instalamos la base de datos y el contexto para nuestros posts de blog. En este post , añadiremos los servicios para interactuar con la base.

En el próximo post detallaremos cómo estos servicios trabajan ahora con los controladores existentes y las vistas.

El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer.

Ahora tenemos una clase de extensión BlogSetup que configura estos servicios. Esta es una extensión de lo que hicimos en El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer., donde instalamos la base de datos y el contexto.

  public static void SetupBlog(this IServiceCollection services, IConfiguration configuration)
    {
        var config = services.ConfigurePOCO<BlogConfig>(configuration.GetSection(BlogConfig.Section));
       services.ConfigurePOCO<MarkdownConfig>(configuration.GetSection(MarkdownConfig.Section));
        switch (config.Mode)
        {
            case BlogMode.File:
                services.AddScoped<IBlogService, MarkdownBlogService>();
                services.AddScoped<IBlogPopulator, MarkdownBlogPopulator>();
                break;
            case BlogMode.Database:
                services.AddDbContext<MostlylucidDbContext>(options =>
                {
                    options.UseNpgsql(configuration.GetConnectionString("DefaultConnection"));
                });
                services.AddScoped<IBlogService, EFBlogService>();
                services.AddScoped<IMarkdownBlogService, MarkdownBlogPopulator>();
                services.AddScoped<IBlogPopulator, EFBlogPopulator>();
                break;
        }
    }

El Comité recomienda al Estado Parte que incluya en su próximo informe periódico información detallada sobre las medidas adoptadas por el Estado parte para eliminar la discriminación contra la mujer. BlogConfig clase para definir qué modo estamos en, o File El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. Database. Sobre la base de estoM SK1 registramos los servicios que necesitamos.

  "Blog": {
    "Mode": "File"
  }
public class BlogConfig : IConfigSection
{
    public static string Section => "Blog";
    
    public BlogMode Mode { get; set; }
}

public enum BlogMode
{
    File,
    Database
}

El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer.

Como quiero soportar tanto el archivo como la Base de datos en esta aplicación (por qué no ?

Tenemos tres nuevas interfaces, IBlogService, IMarkdownBlogService El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. IBlogPopulator.

El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer.

Esta es la interfaz principal del servicio de blog. Conta con métodos para obtener los mensajes, categorías y mensajes individuales .

public interface IBlogService
{
   Task<List<string>> GetCategories();
    Task<List<BlogPostViewModel>> GetPosts(DateTime? startDate = null, string category = "");
    
    Task<PostListViewModel> GetPostsByCategory(string category, int page = 1, int pageSize = 10, string language = BaseService.EnglishLanguage);
    
    Task<BlogPostViewModel?> GetPost(string slug, string language = "");
    
    Task<PostListViewModel> GetPagedPosts(int page = 1, int pageSize = 10, string language = BaseService.EnglishLanguage);
    
    Task<List<PostListModel>> GetPostsForLanguage(DateTime? startDate = null, string category = "", string language = BaseService.EnglishLanguage);
}

IMarkdownBlogService

Este servicio se utiliza por el EFlogPopulatorService en primer intento para llenar la base de datos con mensajes de los archivos de marcaje.

public interface IMarkdownBlogService
{
    Task<List<BlogPostViewModel>> GetPages();
    
    Dictionary<string, List<String>> LanguageList();
}

Como se puede ver' es bastante simple y solo tiene dos métodos, GetPages El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. LanguageList. Estos se utilizan para procesar los archivos Markdown y obtener la lista de idiomas.

IBlogPopulator

Los BlogPopulators se utilizan en nuestra metodología de configuración anterior para popular la base de datos o el objeto de cache static (para el sistema basado en archivos) con puestosM SK2

  public static async Task PopulateBlog(this WebApplication app)
    {
        await using var scope = app.Services.CreateAsyncScope();
        var config = scope.ServiceProvider.GetRequiredService<BlogConfig>();
        if(config.Mode == BlogMode.Database)
        {
           var blogContext = scope.ServiceProvider.GetRequiredService<MostlylucidDbContext>();
           await blogContext.Database.MigrateAsync();
        }
    
        var context = scope.ServiceProvider.GetRequiredService<IBlogPopulator>();
        await context.Populate();
    }

Pueden ver que esta es una extensión a WebApplication con configuración que permite ejecutar la Migración de Bases de datos si es necesario (que también crea la Base de Datos si no existe'no existe ). Luego llama al configurado IBlogPopulator Servicio para popular la base de datos.

Esta es la interfaz para ese servicio.

public interface IBlogPopulator
{
    Task Populate();
}

El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer.

Esta es implementada en ambos sistemas. MarkdownBlogPopulator El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. EFBlogPopulator El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre los hombres y las mujeres en materia de empleo, incluida la eliminación del trabajo forzoso.

  • Markdown - aquí llamamos al GetPages method y popular el cache.
  /// <summary>
    ///     The method to preload the cache with pages and Languages.
    /// </summary>

    public async Task Populate()
    {
        await PopulatePages();
    }

    private async Task PopulatePages()
    {
        if (GetPageCache() is { Count: > 0 }) return;
        Dictionary<(string slug, string lang), BlogPostViewModel> pageCache = new();
        var pages = await GetPages();
        foreach (var page in pages) pageCache.TryAdd((page.Slug, page.Language), page);
        SetPageCache(pageCache);
    }
  • EF - aquí llamamos al IMarkdownBlogService para obtener las páginas y luego popular la base de datos.
    public async Task Populate()
    {
        var posts = await markdownBlogService.GetPages();
        var languages = markdownBlogService.LanguageList();

        var languageEntities = await EnsureLanguages(languages);
        await EnsureCategoriesAndPosts(posts, languageEntities);

        await context.SaveChangesAsync();
    }

Hemos dividido esta funcionalidad en interfaces para hacer que el código sea más comprensible y 'segregadoM SK1 (como en los principios SOLID). Esto nos permite intercambiar fácilmente los servicios basados en la configuración

El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer.

En el próximo post, examinaremos en detalle la implementación de los Controladores y Perspectivas para utilizar estos servicios.

Finding related posts...
logo

© 2026 Scott Galloway — Unlicense — All content and source code on this site is free to use, copy, modify, and sell.