![見出し画像](https://assets.st-note.com/production/uploads/images/85871583/rectangle_large_type_2_ed41d2e3a5f3f88a7ede547a1cc9d1ba.png?width=1200)
概念モデルから Adaptor を生成してシステムに組み込む
※ 本ドキュメントの利用は、https://github.com/kae-made/kae-made/blob/main/contents-license.md に記載のライセンスに従ってご利用ください。
※ 本稿は、Knowledge & Experience への許可なく、本稿のPDF、XPS、スクリーンショット等による電子文書化、紙への印刷等を行い、第三者に提供する行為は、一切禁止とさせていただきます。
0. はじめに
本稿は、
の続編です。上の二つのドキュメントで解説している C# ジェネレータは、BridgePoint で作成したドメインの概念モデルを、実際のコンピューティングリソース上で動かすために必要な最小セットのコード群を、他のプロジェクトと組み合わせて利用可能な、Visual Studio のライブラリ形式のプロジェクト一式に変換します。
ドメインの概念モデルの振舞も含めて C# コードで実行するのに十分なソフトウェア成果物ですが、実際のシステムに組み込んで実行するためには、GUI 等のアプリケーションフロントエンドや、「ビジネスシナリオを元に作成した概念モデルを Azure Digital Twins、Azure Functions を使って実装する」で解説している様々なソフトウェアモジュールとの組み合わせが必要です。
本稿では、システム化するのに必要なソフトウェアモジュールのうち、GUI(Graphical User Interface)を持つアプリケーションへの接続と、REST 形式でのアクセスが可能な Web API を持つアプリケーションへの接続について、関連するテーマを交えながら、「ドメインとITシステム構築」の実践例として解説していきます。
なお、本稿で解説している全てのコードは、
から公開しています。必要に応じてご参照ください。
1. とりあえず使ってみよう
本題に入る前に、まず、複数ドメインを結合した結果として何が得られるかについて、説明しておきます。ここでは、ドメインの概念モデルの中身を見る、振舞を起動する機能を有する、以下の二つのアプリケーションプロジェクトを紹介します。
WPF を使った GUI アプリケーション
REST 形式の Web API アプリケーション
どちらも、概念モデルから生成された C# ライブラリに含まれる、class(概念クラスから生成された C# クラス)、各クラスの property、method、Relationship と、ドメインのファンクションの取得、及び、表示と、概念モデルの C# ライブラリのコードを実行した時の、各クラスのインスタンス一覧、インスタンスの property の値、Relationship でリンクされたインスタンス群の取得、及び、表示を行います。また、クラスオペレーションやドメインファンクション、及び、状態機械を持つインスタンスのエントリアクションの実行の結果発生する、インスタンスの生成・削除、特徴値の更新、Relationship の リンク・アンリンクといった、概念モデルの状態の変更をモニタする機能も有します。
GUI アプリケーションを使えば、概念モデルから生成された C# ライブラリを実行するためのミニマムの機能が揃います。また、Web APIアプリケーションを使えば、ネットワークを介して連携する IT システムの一部として組込みが可能になります。
どちらのアプリケーションも、後で解説する方法によって、個々の(アプリケーション)ドメインの概念モデルとは独立したプログラムとして作られているので、BridgePoint で作成した任意の概念モデルのフロントエンドとして使えます。
使い方は以下の通りです。
先ず、https://github.com/kae-made/domain-model-csharp-adaptor-samples を clone、またはダウンロードします。
Visual Studio 2022 で、UIDomainAdaptorSamples の UIDomainAdaptorSamples.sln を開きます。
WPF を使った GUI アプリケーション
図のように、Kae.DomainModel.Csharp.Utility.Application.WpfAppDomainModelViewer をスタートアッププロジェクトに設定します。
![](https://assets.st-note.com/img/1661746327408-p9CWCjaHRZ.jpg?width=1200)
Kae.DomainModel.Csharp.Utility.Application.WpfAppDomainModelViewer プロジェクトを実行します。
![](https://assets.st-note.com/img/1661746451619-jsZtaMTDVb.jpg?width=1200)
開いたパネルで、図のように、ProjectManagment プロジェクトの bin/Debug/net5.0/ProjectManagement.dll を選択し、ロードします。
![](https://assets.st-note.com/img/1661746626192-lLgeS8qSBp.jpg?width=1200)
ロードしたファイルから、概念クラス、ドメインファンクションの情報が取り出されて表示されます。
真ん中の Operation リストボックスの TestInitialize を選択すると、このファンクションの引数が下のリストボックスに表示されるので、値をセットして、"Invoke" をクリックすると、このドメインファンクションが実行されます。
![](https://assets.st-note.com/img/1661746870086-MnkCW9GJzO.jpg?width=1200)
TestModel/ProcessManagement を BridgePoint で開いて、TestInitialize のアクションを確認すると、
SELECT ANY resourceAssigner FROM INSTANCES OF RA WHERE SELECTED.Name == param.assignerName;
IF EMPTY resourceAssigner
CREATE OBJECT INSTANCE resourceAssigner OF RA;
resourceAssigner.Name = param.assignerName;
CREATE OBJECT INSTANCE resource OF RES;
resource.Name = "Res0Of" + param.assignerName;
RELATE resource TO resourceAssigner ACROSS R6;
CREATE OBJECT INSTANCE resource OF RES;
resource.Name = "Res1Of" + param.assignerName;
RELATE resource TO resourceAssigner ACROSS R6;
CREATE OBJECT INSTANCE resource OF RES;
resource.Name = "Res2Of" + param.assignerName;
RELATE resource TO resourceAssigner ACROSS R6;
END IF;
cmdName = "CmdA";
SELECT ANY orderSpec FROM INSTANCES OF OS WHERE SELECTED.Command == cmdName;
IF EMPTY orderSpec
CREATE OBJECT INSTANCE orderSpec OF OS;
orderSpec.Command = cmdName;
END IF;
cmdName = "CmdB";
SELECT ANY orderSpec FROM INSTANCES OF OS WHERE SELECTED.Command == cmdName;
IF EMPTY orderSpec
CREATE OBJECT INSTANCE orderSpec OF OS;
orderSpec.Command = cmdName;
END IF;
cmdName = "CmdC";
SELECT ANY orderSpec FROM INSTANCES OF OS WHERE SELECTED.Command == cmdName;
IF EMPTY orderSpec
CREATE OBJECT INSTANCE orderSpec OF OS;
orderSpec.Command = cmdName;
END IF;
cmdName = "CmdD";
SELECT ANY orderSpec FROM INSTANCES OF OS WHERE SELECTED.Command == cmdName;
IF EMPTY orderSpec
CREATE OBJECT INSTANCE orderSpec OF OS;
orderSpec.Command = cmdName;
END IF;
と、アクションが定義されているので、Resource Assigner の概念インスタンスが1つ、Resource と Order Spec の概念インスタンスがそれぞれ3つ作成され、作成された Resource 概念インスタンスは、R6 で Resource Assigner の概念インスタンスがリンクされることになります。
パネルの左の Class リストボックスに表示された概念クラス名を選択すると、存在する概念インスタンスのリストが、その下のリストボックスに表示されます。今の状態で、Resource(RES) を選択すると、3つの概念インスタンスが表示されます。
![](https://assets.st-note.com/img/1661747408497-IoaNGqplh5.jpg?width=1200)
概念クラスは、それぞれの概念インスタンスは特徴値の識別子の値で識別できるので、識別子の特徴値のみの値を表示します。
このうちのどれかを選択すると、その概念インスタンスに関するパネルが新たに表示されます。
![](https://assets.st-note.com/img/1661747664672-Q5guB2j6EI.jpg?width=1200)
一番左に、特徴値とその値、2番目に起動可能なクラスオペレーション、3番目に送信可能なイベント、右側に、概念クラスが参加している Relationship のリストが表示されます。
一番左の特徴値は、更新可能な特徴値は編集可能な TextBox になっていて、値を更新して、”Update” をクリックすると、ProcessManagement の該当する概念インスタンスの値が更新されます。
クラスオペレーションは、起動したい項目を選択すると引数が表示されるので、値を設定して ”Invoke”をクリックして実行できます。
イベントは、送信したい項目を選択すると付加データが表示されるので、値を設定して”Invoke”をクリックして送信できます。
Relationship は、表示したい項目を選択すると、その Relationship でリンクされた概念インスタンスのリストが表示されます。表示された概念インスタンス群から一つ選択すると、その概念インスタンス用のパネルが新たに表示されます。
ドメインファンクション起動、クラスオペレーション起動、イベント受信によって引き起こされる概念インスタンスの生成・削除、特徴値更新、リンクの生成・削除が発生すると、表示中の概念インスタンスのパネルの内容が更新されるようになっています。
”クラスオペレーション”という呼び名は、オブジェクト指向言語の class method と混同してしまいそうなのでご注意ください。”クラスオペレーション”は、あくまでも個々の概念インスタンスをターゲットに実行される、オブジェクト指向言語でいうところの instance method と同等です。
見た目が武骨な GUI アプリケーションではありますが、基本的な機能としては十分でしょう。
REST 形式の Web API アプリケーション
ASP.NET Core を使った、フロントエンドアプリケーションです。このアプリケーションを使うことによって、ネットワーク連携する IT システムの一部として組み込めます。
WPF アプリを実行中の場合は、実行を終了してください。
Kae.DomainModel.Csharp.Utility.Application.WebAPIAppDomainModelViewer プロジェクトをスタートアッププロジェクトにセットします。プロジェクトを実行する前に、appsettings.json を開いて、"DomainModelAdaptor" セクションの"Dll"の値を、ProcessManagement/bin/Debug/net5.0/ProcessManagement.dll の絶対パスに書き換えてください。
書き換えが終わったら実行を開始します。
![](https://assets.st-note.com/img/1661749015444-3XQLkqhw7Y.jpg?width=1200)
ASP.NET Core で作成した Web API プロジェクトは Swagger に対応しているので、開発者向けの起動用 Web Page が表示されるという便利な機能を持っています。
起動後、ブラウザで表示された URL をコピーしておいて、一旦終了し、appsettings.json の "SignalR" の "Url" セクションの値を更新します。
![](https://assets.st-note.com/img/1661750119427-6qn3aCohoP.jpg?width=1200)
以上で、初期設定は完了です。再度実行して、概念モデルへの操作ができます。
REST API と概念モデルが提供する機能の対応は、以下の通りです。
GET /api/DomainModel
概念クラスとドメインファンクションの定義情報を取得
POST /api/DomainModel
ドメインファンクションを起動
'name':ドメインファンクション名、'parameters':ドメインファンクションの引数
GET /api/{classKeyLetter}
classKeyLetter で指定された概念クラスの概念インスタンス群を取得
PATCH /api/{classKeyLetter}
classKeyLetter で指定された概念クラスの概念インスタンスの特徴値の更新
'identities':識別子特徴値による概念インスタンスの指定、'parameters':更新する特徴値の名前と値
POST /api/{classKeyLetter}
classKeyLetter で指定された概念クラスの概念インスタンスに対する'opType'で指定された操作
opType = instance -> 概念インスタンス情報取得
'identities' に該当するインスタンスの特徴値の取得
opType == operation -> クラスオペレーションの起動
'name' :クラスオペレーション名、'identities':概念インスタンスの指定、'parameters':クラスオペレーションの引数
opType == event -> イベント送信
'name':イベント名、'identities':概念インスタンスの指定、'parameters':イベントの付加データ
opType == linked -> Relationship でリンクされた概念インスタンス群の取得
'name':Relationship 名、'identities':起点となる概念インスタンスの指定
WPF アプリケーション と同様に、ドメインファンクション、クラスオペレーション、イベント送信による概念モデルの状態変更は、SignalR を使って、'startupHub' を介しての受信が可能です。受信可能なメッセージは以下の二種類です。
'InstanceUpdated'
概念インスタンスの生成・削除・特徴値の更新'RelationshipUpdated'
Relationship のリンク・アンリンク
おいおい、Web API なのにセキュリティが全くないじゃないか…と思われる方もいるかと思いますが、ちょっとした記述を加えるだけで、認証・承認付きでのアクセスが可能になるのでご安心ください。詳しくは、https://docs.microsoft.com/ja-jp/aspnet/web-api/overview/security/
を参照してください。
ProcessManagement プロジェクト
このプロジェクトは、BridgePoint で作成した概念モデルを、https://github.com/kae-made/domainmodel-code-generator-csharp で C# コードに変換して自動生成したプロジェクトです。
更新したい場合は、BridgePoint でこのモデルを開いて、MC3020 で ’Build Project' を行ってから、ConsoleAppCsharpGenerator を使って、
--metamodel c:\BridgePoint\tools\mc\schema\xtumlmc_schema.sql --base-type c:\BridgePoint\tools\mc\schema\Globals.xtuml --domainmodel c:\BridgePoint\workspace\ProcessManagement\gen\code_generation\ProcessManagement.sql --project ProcessManagement --dotnetver net5.0 --gen-folder c:\demo\domain-model-csharp-adaptor-samples\UIDomainAdaptorSamples --action-gen true -adoptor true
というオプションで実行すると再生成が可能です。参考までに、概念モデルと Visual Studio のプロジェクトの関係を図に示しておきます。
![](https://assets.st-note.com/img/1661751204539-4RgwWglW5O.jpg?width=1200)
WPF アプリ、Web API アプリのプロジェクト、及び、概念モデルからの自動生成で使用しているフレームワークや設計は、「Essense of Software Design」で解説している原理原則に従って設計されています。
本稿に関するご質問や、利用に関するご相談は、https://www.kae-made.jp からお問い合わせください。
2. ドメイン統合に関する基本的な考え方
「ドメインと IT システム構築」で解説しているように、IT システムの構築は複数ドメインを統合する作業であるといえます。それぞれのドメインは、それぞれのドメイン毎の特徴に応じた適切な方法で設計・形式化されます。あるドメインは、本稿の Process Management や「概念モデリングチュートリアル ~ ホテルのコインランドリー」、「”商品販売”を例にした、概念モデルチュートリアル」の様に、BridgePoint による概念モデル化されていたり、WPF や ASP.NET の様なフレームワークだったり、Azure Functions や Azure IoT Hub、Azure Digital Twins の様なサービスだったり、C# や Python、C/C++ の様なプログラミング言語だったりもします。以降、「ドメインと IT システム構築」に記載の通り、Process Management や「概念モデリングチュートリアル ~ ホテルのコインランドリー」、「”商品販売”を例にした、概念モデルチュートリアル」などのビジネスシナリオを表現するドメインを”アプリケーションドメイン”と分類し、GUI や Web API の仕組みの部分は、”サービスドメイン”と分類することにします。
本稿で解説している GUI アプリケーションや Web API アプリケーションは、xtUML(eXecutable and Translatable UML)をベースに作成したアプリケーションドメインの概念モデルと、WPF や ASP.NET という実装技術という、全く無関係なものを組み合わせて作成することになります。
WPF や ASP.NET は、「ドメインと IT システム構築」で解説しているように、”サービスドメイン” に分類できます。このドキュメントでは、これら”サービスドメイン”と、”アプリケーションドメイン”との”対応付け”によって実装を構築すると説明されています。
実際に、”変換によるコード自動生成” で開発する場合は、その開発方法として以下のどちらか二つの流儀を選択することになります。
ここから先は
¥ 1,980
Amazonギフトカード5,000円分が当たる
この記事が気に入ったらチップで応援してみませんか?