砂漠の旅人(たびと)|新天地:たびとの旅路

電脳砂漠を旅する、ある旅人の日記。フロッピーを頼りに歩いた日から、クラウドの地平を見つめる今日まで。見つけたオアシスも、迷い込んだ砂の迷宮も、全てこの羊皮紙に。

新世界の夜明け ~.NET 6の荒野に、古の仲間たちを召喚する~

旅の途中、興味深いオアシスを見つけた。忘れないうちに、この羊皮紙に記しておくとしよう。

.NET 6という、新たな世界が幕を開けた。Visual Studio 2022という名の魔法の工房で、新しいプロジェクトを創造してみると、私は愕然とした。長年、我々の旅の始まりを告げてきたStartup.csが、跡形もなく消え去っている。それどころか、全ての魔法の起点であったMain()関数さえも、その姿を消していたのだ。

あまりにシンプルになった、しかし、あまりに変わり果てた世界の姿。この新たな大地で、我々が長年連れ添った仲間たち…NLog、JSNLog、そしてPostgreSQL(EF Core)を、どうすれば再び召喚できるのか? これは、まだ誰も知らない新世界の作法を、手探りで解き明かし、古き仲間たちとの再契約を果たす、一人の魔法使いの、開拓の物語である。

この羊皮紙のあらまし

この羊皮紙が導く者

  • .NET 6とC# 10.0という、新たな魔法体系に、期待と戸惑いを抱く者
  • 変わり果てたProgram.csに、いかにしてログ機能やDB接続の魂を宿らせるか、その術を知りたい探求者

第一の儀式:古き仲間たちとの再契約(NuGetパッケージ)

まずは、NuGetという名の宝物庫から、古き仲間たちの魂を授かる。NLog, JSNLog, Npgsql.EntityFrameworkCore.PostgreSQL, Microsoft.EntityFrameworkCore.Proxies…彼らを、新たな世界へと召喚する。

ASP.NET Core 6.0 にNuGetパッケージを追加する画面
古き仲間たちの魂を、新たな世界へ

第二の儀式:NLogという、世界の声を聴く魔法

何はともあれ、世界の声を聴く術(ロギング)を確保せねば、この先の旅はあまりに危険だ。 nlog.configという名の古文書をプロジェクトに加え、Program.csbuilderに、UseNLog()という呪文を詠唱する。

// Program.cs
var builder = WebApplication.CreateBuilder(args);

// NLogの魂を、世界の創造主に宿らせる
builder.Host.UseNLog();

第三の儀式:JSNLogという、異世界の声を聴く魔法

JSNLogは、クライアントサイド(JavaScript)という、異世界からの声を、我々の世界に届けてくれる貴重な魔法だ。 wwwrootjsnlog.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.ServicesAddDbContextUseNpgsqlの呪文を唱え、我々の世界が、その泉の力を借りられるようにする。

最終形態:新世界の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という名の真実の鏡に、サーバーサイド、クライアントサイド、そしてデータベースから取得した、全ての魂の声が、確かに響き渡るだろう。

Log2Console による実行ログの画面
真実の鏡に映る、新世界の鼓動

羊皮紙を巻く前に

.NET 6という新世界の作法は、まだ多くの謎に包まれている。今回記した儀式も、いずれ、より洗練されたものへと変わっていくことだろう。 しかし、これは、私が手探りで、それでも確かに、古き仲間たちとの絆を、新たな世界で結び直した、最初の記録だ。

この羊皮紙が、同じように、変わり果てた世界の姿に戸惑い、新たな一歩を踏み出せずにいる、未来の冒険者の助けとなることを願う。

風向きが変わったようだ。この機を逃さず、次の砂丘へと旅立とう。

砂漠で見つけた魔法のランプ

  • NLog.Web.AspNetCore | 世界の声を聴く魔法
  • JSNLog | 異世界の声を聴く魔法
  • Npgsql.EntityFrameworkCore.PostgreSQL | 知恵の泉と繋がる魔法
  • Microsoft.EntityFrameworkCore.Proxies | 魂の遅延読み込みを可能にする魔法
  • C# 10.0の新機能に関する、賢者の言葉
  • ufcpp.netによる、新世界の解説書
  • DockerでPostgreSQLを召喚する儀式の記録

ラクダの独り言

ご主人が「世界が変わっちまった!」とか言って、何日も工房にこもって、ぶつぶつと呪文を唱えていた。俺に言わせりゃ、世界なんてのは、毎日少しずつ変わっていくもんだろう。そんなことに、いちいち大騒ぎするもんじゃねえぜ。まったく、人間ってのは、変化に弱い生き物だな。やれやれだぜ。