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

<!--category-- ASP.NET, Entity Framework -->
<datetime class="hidden">2024-08-15T18:00</datetime>

Puede encontrar todos los códigos de fuente para los post del blog en [GitHub](https://github.com/scottgal/mostlylucidweb/tree/main/Mostlylucid/Blog)

**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;](/blog/addingentityframeworkforblogpostspt1).

# 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.

[TOC]

### 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.](/blog/addingentityframeworkforblogpostspt1), donde instalamos la base de datos y el contexto.

```csharp
  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.

```json
  "Blog": {
    "Mode": "File"
  }
```

```csharp
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 .

```csharp
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.

```csharp
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

```csharp
  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.

```csharp
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.

```csharp
  /// <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.

```csharp
    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.