旅の途中、興味深いオアシスを見つけた。忘れないうちに、この羊皮紙に記しておくとしよう。
.NET 6という、新たな世界が幕を開けた。Visual Studio 2022という名の魔法の工房で、新しいプロジェクトを創造してみると、私は愕然とした。長年、我々の旅の始まりを告げてきたStartup.csが、跡形もなく消え去っている。それどころか、全ての魔法の起点であったMain()関数さえも、その姿を消していたのだ。
あまりにシンプルになった、しかし、あまりに変わり果てた世界の姿。この新たな大地で、我々が長年連れ添った仲間たち…NLog、JSNLog、そしてPostgreSQL(EF Core)を、どうすれば再び召喚できるのか? これは、まだ誰も知らない新世界の作法を、手探りで解き明かし、古き仲間たちとの再契約を果たす、一人の魔法使いの、開拓の物語である。
この羊皮紙のあらまし
- この羊皮紙のあらまし
- この羊皮紙が導く者
- 第一の儀式:古き仲間たちとの再契約(NuGetパッケージ)
- 第二の儀式:NLogという、世界の声を聴く魔法
- 第三の儀式:JSNLogという、異世界の声を聴く魔法
- 第四の儀式:PostgreSQLという、知恵の泉との接続
- 最終形態:新世界のProgram.cs
- 羊皮紙を巻く前に
- 砂漠で見つけた魔法のランプ
- ラクダの独り言
この羊皮紙が導く者
- .NET 6とC# 10.0という、新たな魔法体系に、期待と戸惑いを抱く者
- 変わり果てた
Program.csに、いかにしてログ機能やDB接続の魂を宿らせるか、その術を知りたい探求者
第一の儀式:古き仲間たちとの再契約(NuGetパッケージ)
まずは、NuGetという名の宝物庫から、古き仲間たちの魂を授かる。NLog, JSNLog, Npgsql.EntityFrameworkCore.PostgreSQL, Microsoft.EntityFrameworkCore.Proxies…彼らを、新たな世界へと召喚する。

第二の儀式:NLogという、世界の声を聴く魔法
何はともあれ、世界の声を聴く術(ロギング)を確保せねば、この先の旅はあまりに危険だ。
nlog.configという名の古文書をプロジェクトに加え、Program.csのbuilderに、UseNLog()という呪文を詠唱する。
// Program.cs var builder = WebApplication.CreateBuilder(args); // NLogの魂を、世界の創造主に宿らせる builder.Host.UseNLog();
第三の儀式:JSNLogという、異世界の声を聴く魔法
JSNLogは、クライアントサイド(JavaScript)という、異世界からの声を、我々の世界に届けてくれる貴重な魔法だ。
wwwrootにjsnlog.min.jsという名の魂の欠片を配置し、_Layout.cshtmlでそれを読み込む。そして、Program.csの最後に、app.UseJSNLog()という呪文で、異世界との門を開く。
第四の儀式:PostgreSQLという、知恵の泉との接続
Dockerという名の祭壇で、PostgreSQLという知恵の泉を召喚する。
そして、appsettings.jsonに、その泉への道筋(接続文字列)を記す。
// appsettings.json { "ConnectionStrings": { "SampleContext": "host=localhost;port=5432;database=postgres;..." }, ... }
Program.csでは、builder.ServicesにAddDbContextとUseNpgsqlの呪文を唱え、我々の世界が、その泉の力を借りられるようにする。
最終形態:新世界のProgram.cs
数々の儀式を経て、変わり果てたProgram.csは、ついに、古き仲間たちの力を宿した、完全な姿を取り戻した。
// ...(NLogの初期設定)... var builder = WebApplication.CreateBuilder(args); // ...(NLogの魂を宿す)... // Add services to the container. builder.Services // PostgreSQL(EF Core)の力を授ける .AddDbContext<SampleContext>(options => { options.UseNpgsql(builder.Configuration.GetConnectionString("SampleContext")); options.UseLazyLoadingProxies(); }) .AddRazorPages(); var app = builder.Build(); // ...(中略)... // JSNLogという、異世界への門を開く app.UseJSNLog(new LoggingAdapter(app.Services.GetRequiredService<ILoggerFactory>()), new JSNLog.JsnlogConfiguration()); app.Run(); NLog.LogManager.Shutdown();
この新たな世界で、アプリケーションを起動すれば、コンソールやLog2Consoleという名の真実の鏡に、サーバーサイド、クライアントサイド、そしてデータベースから取得した、全ての魂の声が、確かに響き渡るだろう。

羊皮紙を巻く前に
.NET 6という新世界の作法は、まだ多くの謎に包まれている。今回記した儀式も、いずれ、より洗練されたものへと変わっていくことだろう。 しかし、これは、私が手探りで、それでも確かに、古き仲間たちとの絆を、新たな世界で結び直した、最初の記録だ。
この羊皮紙が、同じように、変わり果てた世界の姿に戸惑い、新たな一歩を踏み出せずにいる、未来の冒険者の助けとなることを願う。
風向きが変わったようだ。この機を逃さず、次の砂丘へと旅立とう。
砂漠で見つけた魔法のランプ
- NLog.Web.AspNetCore | 世界の声を聴く魔法
- JSNLog | 異世界の声を聴く魔法
- Npgsql.EntityFrameworkCore.PostgreSQL | 知恵の泉と繋がる魔法
- Microsoft.EntityFrameworkCore.Proxies | 魂の遅延読み込みを可能にする魔法
- C# 10.0の新機能に関する、賢者の言葉
- ufcpp.netによる、新世界の解説書
- DockerでPostgreSQLを召喚する儀式の記録
ラクダの独り言
ご主人が「世界が変わっちまった!」とか言って、何日も工房にこもって、ぶつぶつと呪文を唱えていた。俺に言わせりゃ、世界なんてのは、毎日少しずつ変わっていくもんだろう。そんなことに、いちいち大騒ぎするもんじゃねえぜ。まったく、人間ってのは、変化に弱い生き物だな。やれやれだぜ。