FC2ブログ
Visual Studio Code でASP.NET Core Web Application
まずは、Visual Studio Code をインストールする。
次に、.NET Core SDK (現時点では2.1)をインストールする。

Visual Studio Code を起動し、拡張機能でC# for Visual Studio Code をインストールする。
VSCodeのウィンドウにターミナルがあるので、そこで適当なディレクトリを用意する。

次に下記のコマンドを実行して雛形を作る。
dotnet new mvc
dotnet restore
※その他のテンプレートは公式サイトを確認
https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-new?tabs=netcore21

実行すると雛形がカレントディレクトリに出来上がり、パッケージの復元が行われる。
続けて次のコマンドを実行する
code .

. を忘れずに。VSCode のワークスペースが雛形の場所になるはず。

あとは、VSCode からの告知で、C# のビルド設定がないから作るよとか言われるので指示にしたがって作る。
あとは、F5キーを押して実行するだけ。

Core 1.0 の頃は、npm を使ってYeoman をインストールして、Yeoman 経由で雛形を作っていたけど、いまは dotnet コマンドに雛形があるから使う必要はない。
Core 1.0 で開発したいときは話は別だが。

Linux とかで.NET Coreの環境を作るときによく見るパターンがYeoman を使っているのが多かった。Core 1.0 でも dotnet new は使えたっぽいが、雛形として優秀なYeoman が使われることが多かったのかもしれない。

スポンサーサイト
ASP.NET MVC のビューでnameof とか使いたいよとか
C#のバージョン6 以降からいろいろと機能が追加されて、nameof とか null伝番?とか
使えるようになっていろいろと便利(コンパイラの名称は Roslyn )。
でも、そのままではMVC のビューではなぜか使えない。
※最近は新規作成で下記のパッケージが入っているので気にしなくてもいいかも。
昔のプロジェクトにはそんなのはなかった('A`)y~~~
ビューは実行時にコンパイルされるので、OSに搭載されている.net のコンパイラが使用される。
なので、このバージョンが古いから使えなのが原因。

で、ビューでも使えるようにするためのNugetには次のようなパッケージが存在する。
Microsoft.CodeDom.Providers.DotNetCompilerPlatform
Microsoft.Net.Compilers

この二つを追加すると、web.config にビュー側でRoslynを使う設定が追記される。
また、ビルド時に、/bin/roslyn というディレクトリが作られこの中に、コンパイラがコピーされる。

どこかのサイトで見た覚えがあるのだけど、Webサイトにデプロイすると動かなないらしい。
配置された /bin/roslyn の実行ファイルにアクセス権がないとか。
試しに実験したら普通にデプロイできて、実行してC#6の機能が動作するところまで確認した。 アプリケーションプールもデフォルトのApplicationPoolIdentity を使っている。 もしかしたら、カスタムアカウントに、/bin/roslyn への実行権限がないとかそういう
問題だったのかもしれない

Unity MvcとWebApi の違い
Unity Mvc は System.Web.Mvc.DependencyResolver にUnityコンテナを渡す。
Unity WebAPI は System.Web.Http.GlobalConfiguration.Configuration.DependencyResolver にUnityコンテナを渡す。

そもそもMvc とWebAPI ではリクエストの処理するラインが違うため、依存関係を注入する場所が違っている。
※コントローラー、アクションの選択、生成がそもそも違う。

Mvc でリクエストごとにDispose を呼び出したい場合は
UnityMvcActivator.cs のソースにある下記の行をコメントアウトする。

Microsoft.Web.Infrastructure.DynamicModuleHelper.DynamicModuleUtility.RegisterModule(typeof(UnityPerRequestHttpModule));

また、RegisterType メソッドの引数に PerRequestLifetimeManager のインスタンスを渡す。

WebAPI でリクエストごとにDispose を呼び出したい場合は
UnityHierarchicalDependencyResolver を使って依存関係の解決を行うようにする。
デフォルトでは、UnityDependencyResolver なので変更すること。
また、RegisterType メソッドの引数に HierarchicalLifetimeManager を使う。WebAPIのUnity ライブラリにPerRequestLifetimeManager は存在しない。

Mvc とWebAPI が共存したプロジェクトだと、WebAPI でUnityDependencyResolver を使ってもDispose が呼ばれる。これはPerRequestLifetimeManager のおかげなんだろうけど、ちゃんと仕組みを理解していないため、なんとなく気持ちが悪い。

Mvc で、PerRequestLifetimeManager を使わないで HierarchicalLifetimeManager を使うようにすると、Mvc 側でDispose が呼ばれない。
何か違いがあるのだろう。仕組みを理解しないとだめだなこれは('A`)
Visual Studio 2017 が使用するnode.js を新しいバージョンにする
Visual Studio 2017 をインストールすると自動で入るnode.js のバージョンは5.4.1 だったかな?
ちょっと古い。
なので、package.json で新しいライブラリの依存があると、復元時に警告がでる。

よろしくないので、node.js をアップデートしようと思ったのだがそれっぽいのがない。
調査不足スマヌ('A`)

いろいろと触ってみたら、 メニュー -> ツール -> オプション を開く。
プロジェクトおよびソリューション -> Web Package Management -> 外部Webツールをクリック。
node.js を参照する順序のパスが指定できるので、別個node.jsをインストールして、環境変数のPATHにnode.jsの場所が指定されている場合、$(PATH) を $(VSINSTALLDIR)\Web\External より上にすると$(PATH)にあるnode.js が優先して使われるようになる。

nodist とか使ってバージョンを切り替えても大丈夫だと思う。たぶん。。。
EntityFrameworkCore 2の実装を別なプロジェクトで管理する場合のマイグレーション
適当に一つのソリューションに二つのプロジェクトを用意する。
一つは、Webアプリ、もう一つは、Webアプリが参照するDB関連の処理をまとめたクラスライブラリ。

このクラスライブラリにEntityFramworkのDbContextを作成する。
そして、Webアプリ側はそのクラスライブラリのプロジェクトを参照するようにする。
↑ここ重要

で、VSのパッケージマネージャコンソールから、
# Add-Migration -verbose InitDatabase
とマイグレーションファイルを作成するようコマンドを発行する。

でも、なぜか処理は正常に終わるのにマイグレーションファイルが作られない・・・
仕方がないのでAdd-Migration コマンドの引数を調べてみる。
-StartupProject というオプションがあったので使ってみる。

# Add-Migration -verbose -StartupProject Sample.Web InitDatabase

なんと動作が変わってほかのエラーが出てきた。Context が指定されていないとか
言ってきたので、Context のクラスを指定してみる。

# Add-Migration -verbose -Context SampleDbContext -StartupProject Sample.Web InitDatabase

ちゃんと動いた('A`)y~~~
クラスライブラリのプロジェクトにマイグレーションファイルが生成されている。

じゃ、次にDBに展開してみようと思って次のコマンドを実行してみる

# Update-Database

やっぱり正常に動作するが何も変化がない。Add-Migrationコマンドと同じように引数を追加して実行してみる。

# Update-Database -verbose -Context SampleDbContext -StartupProject Sample.Web

動いた!
EFツールの動作がもしかしたらStartup経由でしか動作しないのかもしれない。
そのための、-StartupProject オプションなんだろうな('A`)y~~~

TOP
プロフィール

hssamurai

Author:hssamurai
FC2ブログへようこそ!

最新記事
最新コメント

最新トラックバック

月別アーカイブ
カテゴリ