Att lägga till enhetens ram för bloggar (Pt 6) (Svenska (Swedish))

Att lägga till enhetens ram för bloggar (Pt 6)

Tuesday, 20 August 2024

//

3 minute read

Inleiding

Nu när jag har den här bloggen som körs med Entity Framework kan jag lägga till nya postituser och språk på ett enkelt sätt. Jag lägger bara en ny markerdown-plik till projektet och kollar den i

I denna artikel ska jag beskriva några små förbättringar som jag gjorde till den här processen och hur den gör det möjligt för framtida förbättringar.

Se delar 1, 2, 3 , 4 och 5 för de tidigare stegen

Hintergrunduppdatering

En av de problem jag stod inför när jag flyttade till EF var att behålla min process för att uppdatera sidan utan att skjuta upp sidans uppdaterande.

I de tidigare delarna visade jag MarkdownBlogService för att få tag i bloggarna och språken. Den här tjänsten injicerades i våra kontroller och synpunkter . Denna tjänst var en enkel tjänst som läste markerdown-filer från disket och återlämnade dem som BlogViewModels.

Aktualiseringsprocessen är följande:

   flowchart LR
    A[Write New Markdown File] -->|Checkin To Github| B(Github Action Triggers)
    B --> C(Builds Docker Image)
    C --> D(Watchtower Pulls new Image)
    D --> E{New Files Added?}
    E -->|Yes| F(Add File to Database)
    E -->|No| G(Skip Database Seeding)
    F --> H(Site Updated)
    G --> H(Site Updated)

För att kunna uppdatera bakgrunden när platsen börjar i ASP.NET använder jag IHostedService att kolla efter nya filer och lägga dem till databasen.

Det är väldigt enkelt och allt som den gör är under

public class BackgroundEFBlogUpdater(IServiceScopeFactory scopeFactory, ILogger<BackgroundEFBlogUpdater> logger) : IHostedService
{
    private Task _backgroundTask;
    public async Task StartAsync(CancellationToken cancellationToken)
    {
       
        var scope = scopeFactory.CreateScope();
        var context = scope.ServiceProvider.GetRequiredService<IBlogPopulator>();
        logger.LogInformation("Starting EF Blog Updater");
      
        _backgroundTask = Task.Run(async () =>    await  context.Populate(), cancellationToken);
       logger.LogInformation("EF Blog Updater Finished");
    }

    public async Task StopAsync(CancellationToken cancellationToken)
    {
        
    }
}

Notera att en viktig aspekt här är att EF är väldigt picky i det. IServiceScopeFactory att skapa ett nytt utrymme för tjänsten. Det beror på att tjänsten är en enkelton och EF inte gillar att användas i en enkel ton Förbrukningen av IServiceScopeFactory är ett vanligt mönster i ASP.NET Core när du behöver använda en scoped service i en singleton service

Jag behövde också använda Task.Run att köra uppgiften i en ny tråd. Det beror på IHostedService kör på huvud threaden och jag ville inte blockera applikationen från att börja.

Det här är BackgroundEFBlogUpdater klass. Det ' injiceras med hjälp av SetupBlog förlängningsmetod som jag visade innan:

    public static void SetupBlog(this IServiceCollection services, IConfiguration configuration, IWebHostEnvironment env)
    {
        var config = services.ConfigurePOCO<BlogConfig>(configuration.GetSection(BlogConfig.Section));
       services.ConfigurePOCO<MarkdownConfig>(configuration.GetSection(MarkdownConfig.Section));
       services.AddScoped<CommentService>();
        switch (config.Mode)
        {
            case BlogMode.File:
                Log.Information("Using file based blog");
                services.AddScoped<IBlogService, MarkdownBlogService>();
                services.AddScoped<IBlogPopulator, MarkdownBlogPopulator>();
                break;
            case BlogMode.Database:
                Log.Information("Using Database based blog");
                services.AddDbContext<MostlylucidDbContext>(options =>
                {
                    if (env.IsDevelopment())
                    {
                        options.EnableSensitiveDataLogging(true);
                    }
                    options.UseNpgsql(configuration.GetConnectionString("DefaultConnection"));
                });
                services.AddScoped<IBlogService, EFBlogService>();
            
                services.AddScoped<IBlogPopulator, EFBlogPopulator>();
                services.AddHostedService<BackgroundEFBlogUpdater>();
                break;
        }
        services.AddScoped<IMarkdownBlogService, MarkdownBlogPopulator>();

        services.AddScoped<MarkdownRenderingService>();
    }

Spesifikt denna linje services.AddHostedService<BackgroundEFBlogUpdater>(); I ASP startar detta en ny HostedService som körs i bakgrunden.

Det här är ett enkelt sätt att lägga till bakgrundsprocessing i din ASP

I slutsats

I det här läget visade jag hur jag lagt till en bakgrundsservice till min ASP-Applikation, ., för att uppdatera databasen med nya bloggar.

Finding related posts...
logo

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