読者です 読者をやめる 読者になる 読者になる

眠いしお腹すいたし(´・ω・`)

C#関連を主に書きます。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

ASP.NET Coreの学習帳

ASP.NET Core MVCの学習帳なのでちょっとずつ更新していきます。

GitHubでやれ、とのうわさがある。

プロジェクト構成

Staticなファイルはwwwrootフォルダに固まってる。 わかりやすくてよい( *´艸`)

jsとかcssファイルのbundleはbundleconfig.jsonにて管理するっぽい。 あまり調べてない。

project.jsonとかある。

以前に.net coreとかになる前に触ったときにあまり良い印象がなかったけど普通にnugetマネージャーで管理できてたのでそこまで苦労しなさそう。

なんかTool系のnugetパッケージはマネージャから追加したときにうまく動かなかった時があった。 コンソールからインストールしたらうまくいった。

設定関連

アプリケーションの設定はappsettings.jsonjsonとして追加していくみたい。

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にする場合には

を入れる。Toolsだけはコンソールマネージャから入れた。

Add-Migration hogeマイグレーションクラスが作成されて

update-database でマイグレーションできる。

マイグレーションするデータベースはDbContextクラスで指定したもの。 DbContextクラスの接続先をDIなどで注入する形をとっている場合、何かのルールで勝手にいい感じに注入が行われて開発環境にマイグレーションできる。

ASP.NET Coreプロジェクトの場合、Startupクラスで注入しているのであれば問題なく開発環境にマイグレーションされた。

ただこのことによってクラウド上の環境にマイグレーションする場合の方法がわからなかった。

もう少し仕組みを調べる必要がある。

DBFirst

調べてない。