首页 > 解决方案 > asp.net core 向 startup.cs 添加启动扩展时遇到问题

问题描述

我在这里遗漏了一些东西。我一直在关注这个 github项目,作者在其中专门添加和扩展了静态方法:

public static class StartupExtension
{
    public static void EnsureMigrationsRun(this IApplicationBuilder app, IConfiguration configuration)
    {
        using (var serviceScope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>().CreateScope())
        {
            var dbContextFactory = serviceScope.ServiceProvider.GetService<IDbContextFactory>();
            var allTenants = serviceScope.ServiceProvider.GetService<ITenantProvider>().AllTenants;
            foreach (var tenant in allTenants)
            {
                var context = dbContextFactory.CreateDbContext(tenant, configuration);
                context.Database.Migrate();
            }
        }
    }
}

在他的 startup.cs 中,他将它(最后一项)添加到 configure 方法中,如下所示:

       app.EnsureMigrationsRun(Configuration);

所以我考虑做类似的事情——在我的配置方法的末尾添加一个方法。

    public static void EnsureMigrationsAndInitialisationRun(IApplicationBuilder app)
    {
        using (var serviceScope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>().CreateScope())
        {
            var dbContextFactory = serviceScope.ServiceProvider.GetService<IDbContextFactory>();
            var allTenantConnectionStrings = serviceScope.ServiceProvider.GetService<ISessionServices>().AllTenantConnectionStrings();

            foreach (var tenantConnectionString in allTenantConnectionStrings)
            {
                var context = dbContextFactory.CreateDbContext(tenantConnectionString);
                context.Database.Migrate();
                // Add in the initializations here.
            }
        }
    }

在我正在查看的项目中,很明显他的方法可以添加(检查智能感知)但是在我的 startup.cs 中,除了作为标准提供的方法之外,我没有选择添加此方法或任何其他方法。

尽管如此,我还是添加了它:

        app.EnsureMigrationsAndInitialisationRun();

并得到以下错误。

错误 CS1061“IApplicationBuilder”不包含“EnsureMigrationsAndInitialisationRun”的定义,并且找不到接受“IApplicationBuilder”类型的第一个参数的可访问扩展方法“EnsureMigrationsAndInitialisationRun”(您是否缺少 using 指令或程序集引用?)

我曾打算向应用程序添加一些项目......包括一个会话中间件,但也没有出现。

如何将会话中间件之类的方法和这种案例初始化方法添加到配置方法中?

为什么这些静态方法不显示?

编辑..

我能够通过指令添加中间件app.UseMiddleware<ConfigureSessionMiddleware>();

但是我仍然不知道我需要做什么才能将初始化文件添加到应用程序管道的末尾

标签: c#entity-framework

解决方案


您没有this在扩展方法中使用关键字,这不会使其成为扩展方法。

如果你在一个静态类中这样做(也是强制性的)它工作得很好

    public static void EnsureMigrationsAndInitialisationRun(this IApplicationBuilder app)
    {
        using (var serviceScope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>().CreateScope())
        {
            var dbContextFactory = serviceScope.ServiceProvider.GetService<IDbContextFactory>();
            var allTenantConnectionStrings = serviceScope.ServiceProvider.GetService<ISessionServices>().AllTenantConnectionStrings();

            foreach (var tenantConnectionString in allTenantConnectionStrings)
            {
                var context = dbContextFactory.CreateDbContext(tenantConnectionString);
                context.Database.Migrate();
                // Add in the initializations here.
            }
        }
    }

然后你可以打电话

app.EnsureMigrationsAndInitialisationRun();

在你的Configure方法中。


推荐阅读