アーカイブ

投稿者アーカイブ

「JetBrainsのクロスプラットフォーム対応.NET IDE「Rider」誕生までの歴史とそのアーキテクチャ」を読んで

JetBrainsのクロスプラットフォーム対応.NET IDE「Rider」誕生までの歴史とそのアーキテクチャ
https://blog.jetbrains.com/jp/2018/11/08/1460

ReShaperにはいつもお世話になっています。
今日はDurable Functionsについて調べる時間だったのに、上のブログが面白い上に長いので、すっかり時間が立ってしまった。。。

以下、読みながら感じたこと
・Riderって、ReSharperとInteliJのプロセス間通信をMVVMの双方向バインドで解決しているんだ
・MicrosoftがLSPを公開した時、CaaSのためにここまでやるかと思ったけれど、JetBrainsも負けてない
・IDEはReactiveな仕組みと本当に相性が良いってのがよくわかる
・Riderに対するマイクロサービスの成功は境界付けられたコンテキストを上手く分割して、ドメインイベントを上手くハンドリングできたことなのかな。お手本のようなシステムだな
・継続的テストはReSharperちもついているけれど、スゴイ、単体テストの考え方が変わる

広告
カテゴリー:未分類

ダウンロードセンターからダウンロードしたMS Project 2019をインストールする

導入 Office 2019 (IT プロフェッショナル向け)をみるとインストール方法が書いてあるんだけれど、なんだかだいぶ難しい

1.MS Project 2019をダウンロードセンターからダウンロードすると、Office の展開ツールがダウンロードされる。

ダウンロード
ダウンロード後、Office展開ツールを起動すると、展開先を求められるので、適当に指定する。
デプロイメントツールの展開

2. 1で展開した先に、configure.xmlを作る。

Configuration.xml を編集します。!? いきなりハードル高いですね。MS Projectをインストールしたいのでこんな感じですかね

3.コマンドプロンプトからセットアップを実施する

先程作成した設定ファイルを指定して、こんなコマンドを実行すると、セットアップが開始します。

c:\temp> .\setup.exe /configure configuration.xml

install

暫く待つとセットアップが終わる

完了

カテゴリー:未分類

EntityFramework のマイグレーションで複数のContextが含まれる場合は -c (-context)オプションを利用する。

Dataプロジェクトに
AppDbContext と AuthDbContext という複数のコンテキストがあった場合、普通にdotnet ef migrations add とかするとこんな感じで怒られるので

More than one DbContext was found. Specify which one to use. Use the ‘-Context’ parameter for PowerShell commands and the ‘–context’ parameter for dotnet commands.

-c もしくは -context オプションを利用する。
https://docs.microsoft.com/ja-jp/ef/core/managing-schemas/migrations/providers

さらに複数のコンテキストのマイグレーションが同じフォルダーで混ざると気持ち悪いので、-o -output オプションを付けてマイグレーションフォルダーを分けると嬉しい

dotnet ef migrations add InitAppDbContext -c AppDbContext -o Migrations/App
dotnet ef migrations add InitAuthDbContext -c AuthDbContext -o Migrations/Auth

もちろん dotnet ef database update 時にも -c をつけるのをお忘れなく

dotnet ef database update -c AppDbContext
dotnet ef database update -c AuthDbContext
カテゴリー:ASP.NET, MySql タグ: ,

Oracle製のMySQLコネクターは、Entity Framework Core 2.1のマイグレーションに対応していない

データベースのマイグレーションを行うためにデータレイヤーのプロジェクト(Data)でマイグレーションスクリプトの追加コマンドを打ったら

cd Data
migrations add First --startup-project "..\WebSite"

こんなエラーが出ました

An error occurred while accessing the IWebHost on class ‘Program’. Continuing without the application service provider. Error: Object reference not set to an instance of an object.

MSDN の デザイン時 DbContext 作成 を見ると、IDesignTimeDbContextFactory を実装したデザイン時のファクトリを用意するということだったので、こんなクラスを作って WebSite プロジェクトにに追加してみた。

    public class DesignTimeDbContextFactory : IDesignTimeDbContextFactory
    {
        public DefaultDbContext CreateDbContext(string[] args)
        {
            var configuration = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("connectionStrings.json")
                .Build();

            var builder = new DbContextOptionsBuilder()
                .UseMySql(configuration.GetConnectionString("idpdb"));
            return new DefaultDbContext(builder.Options);
        }
    }

今度はこんな感じのエラーが出た

Exception message:
System.MissingMethodException: ‘Method not found: ‘Void Microsoft.EntityFrameworkCore.Storage.Internal.RelationalParameterBuilder..ctor(Microsoft.EntityFrameworkCore.Storage.IRelationalTypeMapper)’.’

Entity Framework Core 2.1 のプレビュー時点でのこんな投稿が、どうも Oracle 版の MySql コネクターは Entity Framework の内部的なクラスを触っているようで、Entity Framework のバージョンアップについてこれていないっぽい。
EF Core 2.1 Preview 1 throws MissingMethodException when using Pomelo.EntityFrameworkCore.MySql

MySqlのフォーラムにもバグとして起票はされているけれど動きはなさそう。
https://bugs.mysql.com/bug.php?id=89855

Oracle は ODP.NET の時も Entity Framework に対する動きがだいぶ遅くてもやもやしたけれど、MySQL も同じっぽいなー。ということで、しばらくは Pomelo 版の MySQL コネクターを使ってみようと思います。
https://github.com/PomeloFoundation/Pomelo.EntityFrameworkCore.MySql

書き換えは、UseMySQL を UseMySql にするだけなので簡単ですね。

            services.AddDbContext(options =>
                options.UseMySql(
                    Configuration.GetConnectionString("db")
                    , builder => builder.MigrationsAssembly("ata"))
                );
カテゴリー:ASP.NET, MySql

コンテナサポートを追加するで追加した Dockerfile ファイルと、コンテナオーケストレーターサポートの追加で追加された Dockerfile が微妙に違う

こちらはプロジェクトの追加時、もしくはコンテナサポートの追加時に追加される Dockerfile
パスの指定にダブルクオートがある

FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base
WORKDIR /app
EXPOSE 9080
EXPOSE 44372

FROM microsoft/dotnet:2.1-sdk AS build
WORKDIR /src
COPY ["../WebApplication3/WebApplication3.csproj", "../WebApplication3/"]
RUN dotnet restore "../WebApplication3/WebApplication3.csproj"
COPY . .
WORKDIR "/src/../WebApplication3"
RUN dotnet build "WebApplication3.csproj" -c Release -o /app

FROM build AS publish
RUN dotnet publish "WebApplication3.csproj" -c Release -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "WebApplication3.dll"]

コンテナオーケストレーターサポートの追加で追加された、もしくは上書きされた Dockerfile は、パスの指定にダブルクオートが無い

FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base
WORKDIR /app
EXPOSE 9080
EXPOSE 44372

FROM microsoft/dotnet:2.1-sdk AS build
WORKDIR /src
COPY ../WebApplication3/WebApplication3.csproj ../WebApplication3/
RUN dotnet restore ../WebApplication3/WebApplication3.csproj
COPY . .
WORKDIR /src/../WebApplication3
RUN dotnet build WebApplication3.csproj -c Release -o /app

FROM build AS publish
RUN dotnet publish WebApplication3.csproj -c Release -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "WebApplication3.dll"]

ん?ソリューションフォルダーからの相対位置に空白がある状態で、コンテナオーケストレーターサポートを追加したらどうなるんだろう。
docker build は普通に通るので問題ないのか。

FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base
WORKDIR /app
EXPOSE 9701
EXPOSE 44374

FROM microsoft/dotnet:2.1-sdk AS build
WORKDIR /src
COPY test test/WebApplication4/WebApplication4.csproj test test/WebApplication4/
RUN dotnet restore test test/WebApplication4/WebApplication4.csproj
COPY . .
WORKDIR /src/test test/WebApplication4
RUN dotnet build WebApplication4.csproj -c Release -o /app

FROM build AS publish
RUN dotnet publish WebApplication4.csproj -c Release -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "WebApplication4.dll"]
カテゴリー:Docker タグ:

Visual Studio 2017 15.8でdocker-composeを利用する場合は、コンテナオーケストレーターレーターサポートからdocker-compose.ymlを追加する

Visual Studio 2017 バージョン 15.8 で Docker サポートを有効にした ASP.NET Core のアプリケーションを作ったら、docker-compose.yml が自動的に追加されなかったのでメモ

Visual Studio Tools for Docker と ASP.NET Core」の「アプリにコンテナー オーケストレーター サポートを追加する」を参照すると、下記のような記載が追加されていた。

Visual Studio 2017 バージョン 15.8 以降では、指示された場合にのみ、オーケストレーション ソリューションが追加されます。 ソリューション エクスプローラーでプロジェクトを右クリックして、[追加] > [Container Orchestrator Support](コンテナー オーケストレーター サポート) の順に選択します。 Docker Compose と Service Fabric という 2 つの異なる選択肢が提供されています。

MSDNにある通り、プロジェクトのプロパティー > 追加 > コンテナオーケストレーターサポートを選択し、
DockerComposeの追加1

Docker Compose を選択すると、
DockerComposeの追加2

ベースイメージを Windows にするか Linux にするかを尋ねられるのでOSを選択する。
DockerComposeの追加3

ソリューションに docker-compose が追加され、スタートアッププロジェクトに設定される。
DockerComposeの追加6

こんな感じの docker-compose.yml が追加される。

 version: '3.4'

services:
  webapplication1:
    image: ${DOCKER_REGISTRY}webapplication1
    build:
      context: .
      dockerfile: WebApplication1/Dockerfile

複数のプロジェクトに対してコンテナオーケストレーターサポートを追加すると、docker-compose.yml に設定が追加されるので、必要に応じてdepends_onを設定すればよい。

version: '3.4'

services:
  webapplication1:
    image: ${DOCKER_REGISTRY}webapplication1
    build:
      context: .
      dockerfile: WebApplication1/Dockerfile

  webapplication2:
    image: ${DOCKER_REGISTRY}webapplication2
    build:
      context: .
      dockerfile: WebApplication2/Dockerfile
カテゴリー:ASP.NET, Docker タグ: ,

ReSharperの Type in comment は日本語だとちょっと使いにくい

ReShaper 2018.2 で Type in comment という機能が追加されています。
https://blog.jetbrains.com/dotnet/2013/01/14/respeller-a-spell-checking-plugin-for-resharper/

この機能を有効にすると、あらかじめ登録された辞書に基づいてタイプミスがないか指摘してくれるのですが、日本語の場合分かち書きがうまくできていないこともあり、単語の単位が微妙です。

デフォルトのInspectionレベルはSuggestionなので、ビルド自体には影響はないのですが、気になり場合は無効にする場合は、Action Indicatorから Do not Show を選択すれば消えてくれます。
サジェスチョンの無効

ReSharperのOptionsから、Spelling issues の Typo in comment を変更してもいいですね。
ReSharperの設定

カテゴリー:Visual Studio, 未分類 タグ: