Я работаю над небольшим пакетом многократного использования для приложений .NET Core, который поможет с автоматической миграцией при запуске приложения.
В основном он будет запускать Database.Migrate()
на каждом DbContext
.
Но дело в том, что я хочу запускать его только на DbContexts, который был «помечен» для автоматической миграции.Я думаю, что мог бы расширить AddDbContext
и как-то сказать IServiceCollection
отслеживать конкретный DbContext
.Примерно так:
public static IServiceCollection AddDbContextWithMigration<TContext>(this IServiceCollection serviceCollection, Action<DbContextOptionsBuilder> optionsAction = null, ServiceLifetime contextLifetime = ServiceLifetime.Scoped, ServiceLifetime optionsLifetime = ServiceLifetime.Scoped) where TContext : DbContext
{
//TODO: Somehow remember that this DbContext should be migrated.
return serviceCollection.AddDbContext<TContext, TContext>(optionsAction, contextLifetime, optionsLifetime);
}
Использование:
public IServiceProvider ConfigureServices(IServiceCollection services)
{
services.AddDbContextWithMigration<DbContext1>();
services.AddDbContext<DbContext2>();
services.AddDbContextWithMigration<DbContext3>();
}
Тогда я подумал, что могу либо использовать IStartupFilter
, либо создать метод расширения для IApplicationBuilder
.
С методом расширения:
public static IApplicationBuilder RunMigrations(this IApplicationBuilder app)
{
if (app == null)
throw new ArgumentNullException(nameof(app));
var contexts = app.ApplicationServices.GetService();
foreach (DbContext context in contexts)
{
context.Database.Migrate();
}
return app;
}
С IStartupFilter:
public class MigrationsFilter : IStartupFilter
{
public Action<IApplicationBuilder> Configure(Action<IApplicationBuilder> next)
{
return builder =>
{
var contexts = builder.ApplicationServices.GetService();
foreach (DbContext context in contexts)
{
context.Database.Migrate();
}
next(builder);
};
}
}
Поэтому у меня в основном два вопроса.
- Как мне сохранитьотслеживать, какие DbContexts должны быть перенесены?
- Это "правильное" использование
IStartupFilter
?