ASP.NET Core 2.3 で Razor Class Library を使う
ASP.NET Core 2.3 で Razor Class Library を使う
.NET Framework でも ASP.NET Core は 2.x までは動作していました。2.2 はサポートが終了しましたが、2.1 は .NET Framework に限りサポートされ続けています。しかし 2.2 の方がバージョンが新しいためいろいろと面倒だということで、2.1 を 2.3 としてリリースされました。(参考: ASP.NET Core 2.3 がリリースされました)
ということで、.NET Framework で ASP.NET Core 2.1 のプロジェクトを 2.3 化を試みたのですが、いろいろと問題が... 番号変えただけじゃないのかよ!
Razor Class Library を使う
Razor Class Library とは?
Razor Class Library とは、Razor のクラスライブラリです。開発しているアプリケーションの規模が大きくなるとサブシステムごとに分割します。普通の C# のコードは Visual Studio プロジェクトを分割するだけでいいのですが、Razor はそのままではアセンブリに含まれません。(参考: ASP.NET Core の Razor クラス ライブラリ プロジェクトを使用した再利用可能 UI の作成)
次のように、.csproj
で SDK に Microsoft.NET.Sdk.Razor
を指定するのと、いくつかのパッケージを参照する必要があります。
<Project Sdk="Microsoft.NET.Sdk.Razor">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<LangVersion>13</LangVersion>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.1.3"/>
<PackageReference Include="Microsoft.AspNetCore.Mvc.RazorPages" Version="2.1.11"/>
</ItemGroup>
</Project>
このプロジェクトをスタートアッププロジェクトで参照します。Startup
クラスはいつも通りです。
internal sealed class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc()
.AddRazorPagesOptions(options => options.AllowAreas = true);
}
public void Configure(IApplicationBuilder app)
{
app.UseMvc();
}
}
これで、Hoge.UI
プロジェクト内の Razor Page が表示されるようになります。
2.3 化する... そして失敗
Razor Class Library 側のパッケージを 2.3.0 にアップデートします。
<Project Sdk="Microsoft.NET.Sdk.Razor">
<!-- ... -->
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.3.0"/>
<PackageReference Include="Microsoft.AspNetCore.Mvc.RazorPages" Version="2.3.0"/>
</ItemGroup>
</Project>
そしてスタートアッププロジェクト側も同様にします。
<Project Sdk="Microsoft.NET.Sdk.Web">
<!-- ... -->
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore" Version="2.3.0"/>
<PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.3.0"/>
</ItemGroup>
</Project>
これでいいはずなんですけど、404 Not Found になります。
対処する
あれこれ試しましたが、Microsoft.AspNetCore.Mvc
パッケージを 2.1.3 に戻したらいけました。
<Project Sdk="Microsoft.NET.Sdk.Razor">
<!-- ... -->
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.1.3"/>
<PackageReference Include="Microsoft.AspNetCore.Mvc.RazorPages" Version="2.3.0"/>
</ItemGroup>
</Project>
スタートアッププロジェクトで Microsoft.AspNetCore.Mvc
パッケージに 2.3.0 を指定していますので、実行時は ASP.NET Core 2.3 が使われます。
終わり
Issue 切っておいた。直るといいなあ。
Discussion