旅の途中、興味深いオアシスを見つけた。忘れないうちに、この羊皮紙に記しておくとしよう。
.NET 6という、新たな世界が幕を開けた。Visual Studio 2022という名の魔法の工房で、新しいプロジェクトを創造してみると、私は愕然とした。長年、我々の旅の始まりを告げてきたStartup.csが、跡形もなく消え去っている。それどころか、全ての魔法の起点であったMain()関数さえも、その姿を消していたのだ。
あまりにシンプルになった、しかし、あまりに変わり果てた世界の姿。この新たな大地で、我々が長年連れ添った仲間たち…NLog(サーバーサイドのログ記録ライブラリ)、JSNLog(JavaScriptのログをサーバーに送信するライブラリ)、そしてPostgreSQL(オープンソースのリレーショナルデータベース)をEF Core(Entity Framework Core、.NETのデータアクセス技術)で操る術を、どうすれば再び召喚できるのか?
これは、まだ誰も知らない新世界の作法を、手探りで解き明かし、古き仲間たちとの再契約を果たす、一人の魔法使いの、開拓の物語である。
この羊皮紙のあらまし
- この羊皮紙のあらまし
- この羊皮紙が導く者
- 砂漠の道標
- 第一の儀式:古き仲間たちとの再契約(NuGetパッケージ)
- 第二の儀式:NLogという、世界の声を聴く魔法
- 第三の儀式:JSNLogという、異世界の声を聴く魔法
- 第四の儀式:PostgreSQLという、知恵の泉との接続
- 最終形態:新世界のProgram.cs
- 羊皮紙を巻く前に
- 砂漠で見つけた魔法のランプ
- ラクダの独り言
この羊皮紙が導く者
- .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…彼らを、新たな世界へと召喚する。
第二の儀式: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(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という名の真実の鏡に、サーバーサイド、クライアントサイド、そしてデータベースから取得した、全ての魂の声が、確かに響き渡るだろう。
羊皮紙を巻く前に
.NET 6という新世界の作法は、まだ多くの謎に包まれている。Startup.csの消失、Main()の不可視化…あまりに変わり果てた姿に、多くの旅人が戸惑いを隠せない。しかし、私は手探りながらも、確かに、古き仲間たちとの絆を、この新たな世界で結び直すことができた。
.NET 6移行の核心ポイント
- Program.csへの統合 - Startup.csの役割が全てProgram.csに集約され、コードが大幅に簡潔化された。
- builder.Servicesによる一元管理 - DIコンテナへのサービス登録が、builderパターンで統一され直感的になった。
- 従来ライブラリの継承 - NLogやJSNLogなど、.NET Core時代の資産は適切な設定で引き続き使用可能。
- EF Core + PostgreSQLの安定性 - Npgsqlプロバイダーは.NET 6でも問題なく動作し、データアクセス層の移行は比較的スムーズ。
- 段階的な理解 - 一度に全てを理解する必要はなく、必要な儀式を一つずつ実行していけば必ず道は開ける。
注意すべき落とし穴
- nlog.configの配置 - プロジェクトルートに正しく配置し、「出力ディレクトリにコピー」を設定すること。
- JSNLogの初期化タイミング - app.UseJSNLog()は、他のミドルウェアより後に配置する必要がある。
- 接続文字列の管理 - appsettings.jsonの構造が変わっていないか、必ず確認すること。
まとめ
変化は恐れるべきものではなく、新たな可能性の扉だ。.NET 6は確かに多くを変えたが、その核心にある「開発者の生産性向上」という理念は変わらない。この羊皮紙が、同じように変わり果てた世界の姿に戸惑い、新たな一歩を踏み出せずにいる、未来の冒険者の確かな道標となることを願う。
風向きが変わったようだ。この機を逃さず、次の砂丘へと旅立とう。
砂漠で見つけた魔法のランプ
- NLog.Web.AspNetCore | .NET向けの高機能ログライブラリ。ファイル、コンソール、データベースなど多様な出力先に対応。
- JSNLog | JavaScriptのログをサーバーサイドに送信するライブラリ。クライアント側のエラー追跡に最適。
- Npgsql.EntityFrameworkCore.PostgreSQL | EF CoreでPostgreSQLを使用するためのプロバイダー。高性能で安定性が高い。
- Microsoft.EntityFrameworkCore.Proxies | EF Coreで遅延読み込み(Lazy Loading)を実現するためのプロキシ生成パッケージ。
- C# 10の新機能 | Microsoft公式ドキュメント。トップレベルステートメントなど新構文の詳細解説。
- ufcpp.net - C# 10.0 | 日本語での詳細な解説。.NET 6とC# 10.0の変更点を分かりやすく説明。
- 蜃気楼との決別 ~Docker Desktopを捨て、WSL2に拠点を築く~ | DockerでPostgreSQLを構築する手順を記した、過去の羊皮紙。
- Log2Console 日本語対応版 | ログを視覚的に確認できるツール。文字化けを解消した私家版。
ラクダの独り言
ご主人が「世界が変わっちまった!」とか言って、何日も工房にこもって、ぶつぶつと呪文を唱えていた。俺に言わせりゃ、世界なんてのは、毎日少しずつ変わっていくもんだろう。そんなことに、いちいち大騒ぎするもんじゃねえぜ。まったく、人間ってのは、変化に弱い生き物だな。やれやれだぜ。