问题描述
我有一个使用 FluentMigrator 2.0.7 构建的 .NET 4.5.2 迁移运行程序,“我正在尝试迁移到 .NET 5.0 和 FluentMigrator 3.2.15。
var serviceProvider = new ServiceCollection()
.AddSingleton<ILoggerProvider,sqlScriptFluentMigratorLoggerProvider>()
.Configure<LogFileFluentMigratorLoggerOptions>(o => {
o.OutputFileName = "MyFilename.log";
})
.AddLogging(lb => lb.AddFluentMigratorConsole())
.Configure<FluentMigratorLoggerOptions>(o =>
{
o.Showsql = true;
o.Showelapsedtime = true;
})
.AddFluentMigratorCore()
.ConfigureRunner(builder =>
builder
.AddsqlServer2016()
.WithGlobalConnectionString(this.options.connectionString.ExpandDataDirectory())
.WithMigrationsIn(this.assembly)
)
.BuildServiceProvider();
using (var scope = serviceProvider.CreateScope())
{
var runner = scope.ServiceProvider.GetrequiredService<IMigrationRunner>();
if (this.options.reverseMigration)
runner.MigrateDown(0);
else
runner.MigrateUp();
}
我的问题很简单 - 当我尝试运行迁移时出现错误:
尝试激活“FluentMigrator.Runner.Logging.sqlScriptFluentMigratorLoggerProvider”时无法解析“System.IO.TextWriter”类型的服务。
发生的事情很简单 - TextWriter 是一个抽象类,无法启动。
但是我如何配置 ServiceProvider 以便当它被要求提供 TextWriter 时,它返回一个写入我提供给 LogFileFluentMigratorLoggerOptions 的 OutputFileName 的 StreamWriter?
===
已编辑:
我可以这样做:
using var logStream = new FileStream(this.options.outputFilename,FileMode.Append);
using var sw = new StreamWriter(logStream);
var serviceProvider = new ServiceCollection()
.AddSingleton<TextWriter>(sw)
.AddSingleton<ILoggerProvider,sqlScriptFluentMigratorLoggerProvider>()
...
但我觉得很丑……
解决方法
我可以通过将 LogFileFluentMigratorLoggerProvider 注册为单例然后配置它来将 sql 输出写入文本文件。 LogFileFluentMigratorLoggerProvider 继承自 SqlScriptFluentMigratorLoggerProvider 并负责为您实例化 StreamWriter。
ShipWeapon