ASP.NET Coreの学習帳
ASP.NET Core MVCの学習帳なのでちょっとずつ更新していきます。
GitHubでやれ、とのうわさがある。
プロジェクト構成
Staticなファイルはwwwrootフォルダに固まってる。 わかりやすくてよい( *´艸`)
jsとかcssファイルのbundleはbundleconfig.jsonにて管理するっぽい。 あまり調べてない。
project.jsonとかある。
以前に.net coreとかになる前に触ったときにあまり良い印象がなかったけど普通にnugetマネージャーで管理できてたのでそこまで苦労しなさそう。
なんかTool系のnugetパッケージはマネージャから追加したときにうまく動かなかった時があった。 コンソールからインストールしたらうまくいった。
設定関連
アプリケーションの設定はappsettings.jsonにjsonとして追加していくみたい。
StartupクラスのIConfigurationRoot Configurationプロパティを経由して取得するようになってた。
"Logging": { "IncludeScopes": false, "LogLevel": { "Default": "Debug", "System": "Information", "Microsoft": "Information" }
ConnectionStringは専用の取得拡張メソッドが用意されてる。
"ConnectionStrings": { "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=webapp1;Trusted_Connection=True;MultipleActiveResultSets=true", "StorageConnectionString": "" },
こんなのだったら
Configuration.GetConnectionString("DefaultConnection")
みたいな感じで取得できる。
自分で定義して取りたいようなケースには
"Logging": { "IncludeScopes": false, "LogLevel": { "Default": "Debug", "System": "Information", "Microsoft": "Information" }
からIncludeScopeを取得したい場合
Configuration.GetSection("Logging:IncludeScopes").Value;
で取得できる。
appsettings.jsonはStartupクラスのコンストラクタにて
var builder = new ConfigurationBuilder() .SetBasePath(env.ContentRootPath) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true) .AddEnvironmentVariables(); Configuration = builder.Build();
こんな感じでビルドが行われている。
べつにappsettings.jsonってファイルじゃなくてもオッケー
AddJsonFileの二つ目が大切。
appsettings.xxxx.jsonというのでappsettings.jsonの中身を上書きしている。
env.EnviromentNameというのは環境変数ASPNETCORE_ENVIRONMENTにて設定される値らしい。
デバッグ環境のIIS ExpressではDeploymentと設定されている。
変えたければプロジェクトのPropertiesの下にあるlaunchSettings.jsonにて変更できる。
なので開発環境用、ステージ用、本番環境用にappsettings.jsonを分けて作成できる。
また、このセッティングのもう一つの特徴はappsettings.json以外でも環境変数設定にて指定可能なこと。
例えばappsettingsとかでは管理したくない本番環境の接続文字列とかは、その環境の環境変数に設定してしまえばよい。
ConnectionStrings:DefaultConnection みたいな感じで変数を作成して値に接続文字列を指定するとConfigurationで読み込まれている。
たぶんStartupのコンストラクタのAddEnvironmentVariablesがそれ。
パスワードとか秘密にしたいのは、シークレットなんちゃら、みたいな別の機構があるらしい。未確認。
DependencyInjection
そもそもFrameworkがDIありきで作られてる。すばらしい( *´艸`)
LifeCycleはSingleton/Scoped/Transientの3種類。Webなら十分。
Scopedはちゃんとリクエスト処理終了時にIDisposableならDisposeが呼ばれてたので安心して使える。
Startup.csのConfigureServices関数で注入するみたい。
ConfigureServicesの引数はIServiceCollectionなのだけど、このクラスに対する拡張メソッドが沢山用意されてる、
Loggingとかantiforgeryとか。
たぶん必要になったら追加したりするのでしょう。
設定ファイルからの注入が可能かは未確認。-> 確認したい。使うクラスを切り替えるのにビルドしなおす必要があるのは嫌だ。
ロギング
まだ調べてない。
O/Rマッパー
一般的にはEntityFramework Core https://docs.efproject.net/en/latest/を使うらしい。
Dapperは.NetStd1.3に対応していたので使える。
PetaPocoは www.nuget.org 対応してくれた方がいた。 ただPocoクラス作成のT4がなかったので(´・ω・`)なかんじ。
基本的には機能制限方向。コンスラクタがIDbConnectionを引数とする一択だった。
EntityFramework Core
Codefirst
DbContextを継承して各パターンはそのまま。
マイグレーションをするには
SQLServerにする場合には
- Microsoft.EntityFrameworkCore.Design
- Microsoft.EntityFrameworkCore.SqlServer.Design
- Microsoft.EntityFrameworkCore.Tools (Prev)
を入れる。Toolsだけはコンソールマネージャから入れた。
Add-Migration hoge でマイグレーションクラスが作成されて
update-database でマイグレーションできる。
マイグレーションするデータベースはDbContextクラスで指定したもの。 DbContextクラスの接続先をDIなどで注入する形をとっている場合、何かのルールで勝手にいい感じに注入が行われて開発環境にマイグレーションできる。
ASP.NET Coreプロジェクトの場合、Startupクラスで注入しているのであれば問題なく開発環境にマイグレーションされた。
ただこのことによってクラウド上の環境にマイグレーションする場合の方法がわからなかった。
もう少し仕組みを調べる必要がある。
DBFirst
調べてない。