WASMなのにサーバーでも動作する!にハマる
新しいBlazorを試してみています。Page毎にRenderModeを指定できるようになったのが新しい!所以ですが、逆に言うとRenderModeをどうするのか?を考えなくてはなりません。とにかく、Interactiveが必要な場合はSSRで対応できないので、InteractiveServerかInteractiveWebAssemblyのいずれかになるわけですが、とりあえず、InteractiveWebAssemblyにすることにしましょう。ここでふと疑問になるのは、Interactiveが必要じゃない場合ってなあに??です。いやどんな場合でもInteractiveが必要でしょう! 一覧ページから詳細ページを開くのだってInteractiveでしょう!だからといって全部WASMにしてたらSSRできるようになった意味はないわけで... なにをInteractiveなRenderにすれば良いのか?←実にこれはなかなか難問のような気がします。どうなのでしょう?
それはさておき、まずは、WASM版WeatherForecastページを追加してみようと思います。これは左程心配することなく、サーバー側プロジェクトにWebAPIなメソッドを追加することはできました。そして、Client側プロジェクトにWeatherForecastページを追加して、APIからデータを取得してみましょう。ページリンクをクリックすると、There is no registered service of type 'System.Net.Http.HttpClient'. エラーが発生しますTT もちろん、Client側プロジェクトにはHttpClientのDIコンテナの準備も追加しています。はい、このエラーはサーバー側で発生するのです。プリレンダリングですね。RenderModeで意図的に停止しない限りプリレンダリングはデフォルトで有効です。そしてサーバー側プロジェクトに(必要がないので)HttpClientを準備してないのでこのエラーになるわけです。うみゅみゅ。一応、ページのOnInitializedAsyncは、Server側とClient側でそれぞれに発生するので、データ取得コードの切り分けはできそうです。コンストラクタも別々に用意できるのでしょうか?もしできないとしたら...使いもしないサービスをDIするのはどうも納得できません。とか、いろいろ襲ってきて、思考は一旦、停止してしまいますた。
SSRなページと、InteractiveWebAssemblyなページをどのように分けて、それぞれどのように作成していけば良いのか?この辺りはちょっと整理して決めておく必要がありそうです。というか、もっと光を!(もっと説明を!)