たびとの旅路 ~電脳砂漠の冒険譚~

フロッピー頼りに歩き、クラウドの地平を見つめる今日まで。見つけたオアシス、迷い込んだ砂の迷宮、全てこの羊皮紙に。

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

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

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

あまりにシンプルになった、しかし、あまりに変わり果てた世界の姿。この新たな大地で、我々が長年連れ添った仲間たち…NLog(サーバーサイドのログ記録ライブラリ)、JSNLog(JavaScriptのログをサーバーに送信するライブラリ)、そしてPostgreSQL(オープンソースのリレーショナルデータベース)をEF Core(Entity Framework Core、.NETのデータアクセス技術)で操る術を、どうすれば再び召喚できるのか?

これは、まだ誰も知らない新世界の作法を、手探りで解き明かし、古き仲間たちとの再契約を果たす、一人の魔法使いの、開拓の物語である。

この羊皮紙のあらまし

この羊皮紙が導く者

  • .NET 6とC# 10.0という、新たな魔法体系に、期待と戸惑いを抱く者
  • Startup.csの消失に困惑し、Program.csでのサービス登録方法を探している開発者
  • NLogやJSNLogといったログライブラリを.NET 6で使い続けたい実務者
  • PostgreSQLとEF Coreを組み合わせた環境を、最新の.NETで構築したい技術者
  • 従来の.NET Coreからの移行において、具体的な実装例を求めている探求者

砂漠の道標

  • .NET 6 - Microsoftが2021年11月にリリースした、統合された.NETプラットフォームの最新版。
  • C# 10.0 - .NET 6と共に登場した、C#言語の新バージョン。トップレベルステートメントなど簡潔な記法を導入。
  • NLog - .NET向けの高機能なログ記録ライブラリ。ファイル、コンソール、データベースなど多様な出力先に対応。
  • JSNLog - JavaScript(クライアントサイド)のログをサーバーサイドに送信するためのライブラリ。
  • EF Core (Entity Framework Core) - .NETの公式データアクセス技術。オブジェクトとデータベースを橋渡しするORM。
  • Npgsql - .NETからPostgreSQLに接続するためのデータプロバイダー。
  • Startup.cs - .NET Core 3.1以前でアプリケーション設定を行っていたファイル。.NET 6では統合され消滅。
  • builder.Services - .NET 6のProgram.csで、依存性注入(DI)コンテナにサービスを登録する際に使用するプロパティ。
  • UseNLog() - NLogをアプリケーションのログシステムとして組み込むための拡張メソッド。
  • AddDbContext - EF CoreのDbContextをDIコンテナに登録し、データベース接続を管理するためのメソッド。

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

まずは、NuGet(.NETのパッケージ管理システム)という名の宝物庫から、古き仲間たちの魂を授かる。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)という、異世界からの声を、我々の世界(サーバー)に届けてくれる貴重な魔法だ。 wwwroot(静的ファイルを配置するフォルダ)にjsnlog.min.jsという名の魂の欠片を配置し、_Layout.cshtml(Razorページの共通レイアウト)でそれを読み込む。そして、Program.csの最後に、app.UseJSNLog()という呪文で、異世界との門を開く。

第四の儀式:PostgreSQLという、知恵の泉との接続

Docker(コンテナ仮想化技術)という名の祭壇で、PostgreSQL(オープンソースのデータベース)という知恵の泉を召喚する。 そして、appsettings.json(アプリケーション設定ファイル)に、その泉への道筋(接続文字列:データベースへのアクセス情報)を記す。

// appsettings.json
{
  "ConnectionStrings": {
    "SampleContext": "host=localhost;port=5432;database=postgres;..."
  },
  ...
}

Program.csでは、builder.Services(DIコンテナへのサービス登録)にAddDbContext(EF CoreのDB接続設定)とUseNpgsql(PostgreSQL用のプロバイダー指定)の呪文を唱え、我々の世界が、その泉の力を借りられるようにする。

最終形態:新世界の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という新世界の作法は、まだ多くの謎に包まれている。Startup.csの消失、Main()の不可視化…あまりに変わり果てた姿に、多くの旅人が戸惑いを隠せない。しかし、私は手探りながらも、確かに、古き仲間たちとの絆を、この新たな世界で結び直すことができた。

.NET 6移行の核心ポイント

  1. Program.csへの統合 - Startup.csの役割が全てProgram.csに集約され、コードが大幅に簡潔化された。
  2. builder.Servicesによる一元管理 - DIコンテナへのサービス登録が、builderパターンで統一され直感的になった。
  3. 従来ライブラリの継承 - NLogやJSNLogなど、.NET Core時代の資産は適切な設定で引き続き使用可能。
  4. EF Core + PostgreSQLの安定性 - Npgsqlプロバイダーは.NET 6でも問題なく動作し、データアクセス層の移行は比較的スムーズ。
  5. 段階的な理解 - 一度に全てを理解する必要はなく、必要な儀式を一つずつ実行していけば必ず道は開ける。

注意すべき落とし穴

  • nlog.configの配置 - プロジェクトルートに正しく配置し、「出力ディレクトリにコピー」を設定すること。
  • JSNLogの初期化タイミング - app.UseJSNLog()は、他のミドルウェアより後に配置する必要がある。
  • 接続文字列の管理 - appsettings.jsonの構造が変わっていないか、必ず確認すること。

まとめ

変化は恐れるべきものではなく、新たな可能性の扉だ。.NET 6は確かに多くを変えたが、その核心にある「開発者の生産性向上」という理念は変わらない。この羊皮紙が、同じように変わり果てた世界の姿に戸惑い、新たな一歩を踏み出せずにいる、未来の冒険者の確かな道標となることを願う。

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

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

ラクダの独り言

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