我正在使用一個 .Net WinForms 應用程式,該應用程式旨在從 MongoDB 收集記錄并將記錄插入 SQL Server 資料庫。
我在下面遇到的錯誤在 Application.Run(...) 處被標記
System.InvalidOperationException:'無法從根提供程式決議'FixSqlChatHistory.WinForm.MongoReader',因為它需要范圍服務'FixSqlChatHistory.DataContext.MongoToSqlContext'。'
我正在使用的代碼是
static void Main()
{
Application.SetHighDpiMode(HighDpiMode.SystemAware);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
var host = CreateHostBuilder().Build();
ServiceProvider = host.Services;
Application.Run(ServiceProvider.GetRequiredService<MongoReader>());
}
public static IServiceProvider ServiceProvider { get; private set; }
static IHostBuilder CreateHostBuilder()
{
var assemblies = AppDomain.CurrentDomain.GetAssemblies()
.Where(x => x.GetName().Name.Contains("FixSqlHistory"));
var builder = new ConfigurationBuilder()
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
Configuration = builder.Build();
return Host.CreateDefaultBuilder()
.ConfigureServices((context, services) => {
services.AddScoped<IMongoReader, MongoService>();
services.AddScoped<IChatActivityReader, ChatDataFixService>();
services.AddScoped<IChatActivityWriter, ChatDataFixService>();
services.AddAutoMapper(assemblies);
services.AddDbContext<MongoToSqlContext>(options => options.
UseSqlServer(Configuration.GetConnectionString("DefaultConnection")))
services.AddScoped<MongoReader>();
});
}
MongoReader (Form) 是這樣構造的
public MongoReader(
MongoToSqlContext databaseContext,
IChatActivityReader chatActivityReader,
IChatActivityWriter chatActivityWriter,
IMongoReader mongoReader)
{
_databaseContext = databaseContext;
_chatActivityReader = chatActivityReader;
_chatActivityWriter = chatActivityWriter;
_mongoReader = mongoReader;
InitializeComponent();
}
自從我創建 WinForms 應用程式以來已經有很長時間了,而且是第一次在 .Net6 中創建,所以如果我出錯了,我將不勝感激。
我看過這里,這似乎是一個類似的問題,但正如這篇文章所建議的那樣,我使用 AddScoped 進行了設定
無法從根提供程式決議“ServiceBusConsumer”,因為它需要范圍服務 DbContext
uj5u.com熱心網友回復:
您需要手動創建范圍:
static void Main()
{
// ...
ServiceProvider = host.Services;
using var scope = ServiceProvider.CreateScope();
Application.Run(scope.ServiceProvider.GetRequiredService<MongoReader>());
}
或者注冊具有相應生命周期的所有內容(AddDbContext允許指定與默認生命周期不同的背景關系生命周期Scoped)。
請注意,根據應用程式的不同,您可能不希望在其整個生命周期中使用相同的背景關系。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/517680.html
