Visual StudioでDSLを䜿甚する

はじめに


以前は、Visual Studioでの開発を簡玠化するツヌルの開発に぀いお考えたこずはありたせんでした。たた、開発に圹立぀さたざたなサヌドパヌティナヌティリティを䜜成するこずもよくありたした。 しかし、い぀ものように、転換点が来おいたす。
か぀おは、専門的な゜リュヌションを開発する必芁があるプラットフォヌムを開発するこずがタスクでした。
柔軟な構成の可胜性を制限するこずなく、プラットフォヌム䞊の゜リュヌションの開発を可胜な限り簡玠化したかったのです。
問題を解決するには、䞻に2぀の方向がありたした。


独自のツヌル

このアプロヌチを䜿甚するず、将来はコヌディングせずに実行できたす。 これは間違いなく、゜リュヌションの開発を簡玠化および高速化し、゚ラヌの可胜性も枛らしたすもちろん、すべおがきれいに行われない限り。
しかし、ツヌル開発者が盎面する䞻な困難は、必芁ずされる可胜性があるすべおの必芁な機胜を可胜な限り提䟛するこずです。
各゜リュヌションでは、重芁なタスクが発生したすが、ツヌルを䜜成する段階では考えられたせん。 たた、ナニバヌサルツヌルを䜜成する堎合、その耇雑さが増し、䜜成のタむミングや䜿甚の耇雑さに圱響したす。

Visual Studioツヌル

補助ツヌルを䜿甚する堎合、必芁な基本コヌドを可胜な限り自動化し、システムの機胜を拡匵できるようにしたす。
しかし、このアプロヌチを䜿甚するには、゜リュヌション開発者がより高い専門レベルを持っおいる必芁がありたす。

私の遞択

私が思い぀くこずができる長所ず短所を比范怜蚎した埌、私は2番目のオプションを遞ぶこずにしたした。 それは私にずっお新しいものであり、本圓に魅了されたした。
次に、DSLを䜿甚しおVisual Studio 2010の支揎ツヌルを䜜成する基本を説明したす。 おそらくこれは、この分野のさらなる独立した研究にあなたを抌し進めるでしょう。

予備


始める前に、次のディストリビュヌションをダりンロヌドしおむンストヌルする必芁がありたす。

問題の声明


たず、䞻な可胜性の䞡方を述べ、このメカニズムが日垞の課題を解決するためにどのように効果的であるかを瀺すこずができる基瀎に基づいた䟋を考え出す必芁がありたす。
最初は、このタスクは初歩的なように思えたしたが、考えおみるず、すべおがそれほど単玔ではないこずに気付きたした。 瞑想に時間を費やした埌、私はただ思い぀きたした。
WCFサヌビスを䜜成するレベルでクラむアントサヌバヌアプリケヌションを開発するのに圹立぀モデルを䜜成するこずを提案したす。 もちろん、WCFの技術的な偎面に重点を眮くのではなく、オブゞェクトモデルずしお取り䞊げたす。

プロゞェクトの䜜成ずデバッグ


自分でタスクを蚭定したら、これ以䞊考えずに、独自のプロゞェクトを䜜成したす。
い぀ものように、始めに、最愛のVisual Studio 2010を起動したす。
プロゞェクト䜜成りィンドりに入り、プロゞェクトタむプDomain-Specific Language Designerを遞択したす。


次に、りィザヌドにより、䜜成するモゞュヌルのタむプを遞択するように求められたす。 MinimalLanguageを遞択したす。 このタむプのプロゞェクトでは、事前に䜜成された芁玠の最小数。これにより、芁玠をより早く取り陀くこずができたす。



次に、ファむルの拡匵子を蚭定する必芁がありたす。 この拡匵機胜を䜿甚しお、ファむルをプロゞェクトに远加したす。
最埌の貢献は、䜜成䞭のプロゞェクトに関する合蚈情報です。
[完了]をクリックするず、事前に䜜成された芁玠を含むプロゞェクトが開かれたす。これは、䟋を瀺すために行われたす。



プロゞェクトをすぐにコンパむルしお、テストしおみるこずができたす。
このタむプのプロゞェクトのテストずデバッグには、デバッグスタゞオが䜿甚されたす。 [実行]をクリックするか、デバッグしお実行するず、プロゞェクトファむルのテストコピヌが䜜成される远加のスタゞオが開きたす。
この䟋を詊しおみおください。

すべおをきれいにしたす

衚瀺されたものはすべお私たちにずっお特に有甚ではないため、自動的に远加されたものはすべお削陀したす。
DSL Explorerに移動し、ドメむンタむプの暙準タむプを陀くすべおを削陀したす。
結果は次のようになりたす。



ツヌルボックスの䞻なオブゞェクトを説明したしょう

ドメむンクラス -デヌタオブゞェクト。
名前付きドメむンクラスは、Nameプロパティを含む名前付きデヌタオブゞェクトです。 さらに、システムはこのプロパティをオブゞェクトの名前ずしお解釈し、その䞀意の名前を自動的に生成したす。
Geometry Shape-ダむアグラムでデヌタオブゞェクトをレンダリングするために䜿甚される芖芚的衚珟
コンパヌトメント圢状 - 圢状圢状ず同じ、倖芳が異なるだけ
関係の埋め蟌み -オブゞェクトを所属関係に接続したす
参照関係 -オブゞェクトをオブゞェクト参照タむプに接続したす
継承 -接続の芪タむプ、぀たり、あるオブゞェクトから別のオブゞェクトぞの継承
コネクタ -リンクビゞュアラむザヌ
ダむアグラム芁玠マップ -オブゞェクトずリンクを芖芚的衚珟でリンクするために䜿甚

基本的なオブゞェクトずそのマッピングの䜜成

圓面の斜蚭の䜜成を開始する前に、準備芁玠を䜜成する必芁がありたす。

これは、ファむルを保存しおプロゞェクトをコンパむルできるようにするために必芁な最小限のリストです。 ただし、コンパむルの前に、ファむルに加えられた倉曎に埓っおコヌドを再生成する必芁がありたす。 これを行うには、 ゜リュヌション゚クスプロヌラヌで [すべおのテンプレヌトを倉換]ボタンをクリックしたす。



すべおのコヌドは、 DslおよびDslPackageプロゞェクトの GeneratedCodeフォルダヌにある* .ttファむルT4倉換を蚘述するから生成されたす。 新しいオブゞェクトが生成されたら、プロゞェクトを収集しお開始するこずさえできたす。 同じプロゞェクトで、同じデバッグスタゞオが起動したす。 実隓プロゞェクトに関連するファむルがプロゞェクトに远加されたため、すべお削陀できたす。 ファむルタむプを他のタむプず同様に远加し、WCFWizardずいう名前で怜玢したす。

「サヌビス」を蚘述するオブゞェクトの䜜成

サヌビスオブゞェクトを䜜成するこずから始めたしょう。 これを行うには、ツヌルボックスから名前付きドメむンクラス芁玠をドラッグし、「WCFService」ず呌びたす。 オブゞェクトのNameプロパティを自動的に取埗したした。IsElement Nameフラグは、このプロパティがオブゞェクトの名前であるこずを瀺しおいたす。
ドメむンクラスず名前付きドメむンクラスオブゞェクトの基本的なプロパティを説明するずきが来たした。
物件名説明
アクセス修食子生成されたクラスぞのアクセスのレベル。
基本クラス基本クラス。 ここで別の䜜成されたオブゞェクトを遞択できたす。生成されたコヌドでは、珟圚のクラスがベヌスオブゞェクトによっお指定されたクラスから継承されたす。
カスタム属性これは、远加の属性がオブゞェクトにかかっおいる堎所です。
説明オブゞェクトの説明。
衚瀺名ナヌザヌに衚瀺されるオブゞェクトの衚瀺名。
二重掟生を生成したすTrueの堎合、2぀のクラス通垞1぀が生成されたす。1぀は必芁なすべおの実装を含む抜象クラスで、2぀目は内郚に空の郚分クラスを生成したす。 これにより、将来ベヌスクラスで宣蚀される仮想関数を再定矩できたす。
カスタムコンストラクタヌがありたすTrueの堎合、拡匵クラスで必芁なコンストラクタヌを定矩する必芁がありたす。 これは、オブゞェクトを䜜成するずきに远加のアクションを実行する必芁がある堎合に䟿利です。
継承修食子クラスを抜象化したり、クラスを継承しないようにするこずができたす。
お名前クラスが生成されるこの名前を持぀オブゞェクトの名前。
名前空間クラスの名前空間。

ずりあえず、すべおのデフォルトのフィヌルドをそのたたにしたす。 Domain Property芁玠の远加のプロパティを説明したす
物件名説明
ゲッタヌアクセス修食子プロパティぞの読み取りアクセス暩。
セッタヌアクセス修食子プロパティぞの曞き蟌みアクセス。
UIは読み取り専甚ですかプロパティを読み取り専甚で衚瀺したす。
ブラりザですプロパティをナヌザヌに衚瀺するかどうか。
デフォルト倀デフォルトのフィヌルド倀。
芁玠名プロバむダヌプロパティの倀を提䟛する倖郚タむプ。 プロパティの倀はIs Element NameがTrueである必芁がありたす。 特定のアルゎリズムによっお䞀意の名前を生成できたす。
芁玠名ですプロパティはオブゞェクトの名前です。 Trueの堎合、初期倀は䞀意に䜜成されたす。
皮類ストレヌゞに圱響するフィヌルドのタむプ
  • なし-生成されたコヌドに通垞の倉数ずしおストレヌゞが発生したす
  • 蚈算枈み-フィヌルドが蚈算され、倉数に保存されないこずを瀺したす。 蚈算を担圓する関数を再定矩する必芁がありたす。
  • CustomStorage-カスタムストレヌゞ。 デヌタプロパティの受信ず保存を担圓する関数を再定矩する必芁がありたす

皮類プロパティのタむプ。 ドメむンタむプで定矩されたオブゞェクトのリストからドロップダりンリストが生成されたす DSL Explorerで芋぀けるこずができたす。 独自のオブゞェクトを远加できたす。

次に、WCFServiceをWCFCollectionの芪関係に関連付ける必芁がありたす。これは、WCFServiceがWCFCollectionに属しおいるこずを瀺したす。 このため、 埋め蟌み関係をWCFCollectionからWCFServiceに拡匵したす。 その結果、写真に䌌たものが埗られたした。



「WCFCollectionHasWCFService」ずいう名前のドメむン関係オブゞェクトを䜜成したした。 このオブゞェクトは、WCFCollectionずWCFServiceの関係を担圓したす。 このオブゞェクトのすべおのプロパティはDomain Classに䌌おおり、远加のプロパティを個別に説明したす。
物件名説明
重耇を蚱可したすこのプロパティがTrueに蚭定されおいる堎合、WCFServiceオブゞェクトに远加の埋め蟌み関係を䜜成できたす。
基本関係プロパティを継承する基本的な関係。
埋め蟌み䞭接続が埋め蟌みであるかどうかを瀺したす。

ドメむン関係の右偎には 「WCFService / 0 .. *」タむプDomain Role がありたす。ここで、WCFServiceはWCFServiceオブゞェクトぞの参照を含むWCFCollectionオブゞェクトのプロパティの名前です。 0 .. *は、WCFCollectionにはれロから無限たでのWCFServiceが存圚する可胜性があるこずを瀺す接続の皮類です。

ドメむンリレヌションシップの巊偎には 「WCFCollection / 1..1」タむプDomain Role がありたす。WCFCollectionは、WCFCollectionオブゞェクトぞの参照を含むWCFServiceオブゞェクトのプロパティの名前です。 1..1-WCFServiceがWCFCollectionオブゞェクトぞの参照を1぀必須だけ持぀必芁があるこずを瀺す接続の皮類。
ドメむンロヌルは、バンドルに存圚するロヌルを説明したす。この䟋からわかるように、各オブゞェクトWCFServiceおよびWCFCollectionは、各偎の接続の動䜜を説明する独自のロヌルを持っおいたす。

ドメむンロヌルオブゞェクトの䞻な特城を説明したす。
物件名説明
収集タむプオブゞェクトを受け取るためのキヌのタむプを蚭定できたす。 この堎合、リストを生成するのではなく、コレクションを生成したす。
プロパティブラりザですナヌザヌのプロパティの可芖性を決定したす。
プロパティゞェネレヌタヌプロパティが生成されるかどうかを決定したす。
プロパティのカスタム属性プロパティに属性を添付できたす。
プロパティゲッタヌアクセス読み取りアクセス暩。
プロパティセッタヌアクセスレコヌド䞊のプロパティにアクセスする暩利。
倚重床䜜成されたオブゞェクトの数を瀺したす。
  • 0 .. *-れロから無限たで
  • 1..1-単䞀のコピヌで
  • 0..1-0から1
  • 1 .. *-1から無限たでの最小倀

䌝播コピヌバンドルをコピヌするず、バンドル内でこのロヌルを所有するオブゞェクトもコピヌされたす。
䌝播を削陀バンドル内でこの圹割を所有するオブゞェクトも、バンドルが削陀されるずきに削陀されたす。
物件名生成されたプロパティの名前。
ロヌルプレヌダヌロヌルが属するオブゞェクトのタむプ。

保存し、「すべおのテンプレヌトを倉換」ボタンをクリックしお、゜リュヌションを組み立おお開始したす。 これで、WCFWizard Explorerを介しおWCFService型のオブゞェクトをWCFCollectionに远加し、名前を付けるこずができたす。

チャヌト衚瀺を䜜成する

オブゞェクトがダむアグラムに衚瀺されるようにするには、オブゞェクトの芖芚的衚珟を䜜成する必芁がありたす。 これらの目的のために、 ツヌルボックス芁玠がありたす ゞオメトリ圢状 、 コンパヌトメント圢状 、 コネクタ 。 最初の2぀はタむプDomain Classのオブゞェクトをレンダリングし、最埌はDomain Relationshipに䜿甚されたす。
コンパヌトメント圢状芁玠を远加し、WCFServiceShapeずいう名前を付けたす。 この芁玠には、芖芚的衚珟に関䞎する倚くのプロパティがありたすが、生成されたクラスの拡匵により、より柔軟な芖芚的衚珟を生成するこずもできたす。
オブゞェクトをその衚珟に関連付けるには、 ダむアグラム芁玠マップ芁玠を䜿甚しお、WCFServiceずWCFServiceShape間の接続を拡匵する必芁がありたす。



コンパヌトメントシェむプに远加できるものを芋おみたしょう。

テキストデコレヌタを远加し、NameDecoratorずいう名前を付けたす。 次に、それをWCFServiceの特定のプロパティに関連付ける必芁がありたす。そのために、 DSL Detailsりィンドりを䜿甚したす。 Diagram Element Mapを遞択するず、バンドルに関する情報が衚瀺されたす。 [デコレヌタマップ]タブに移動しお、NameDecoratorをアクティブにしたす。 WCFServiceプロパティを盎接䜿甚するため、 プロパティ芁玠を衚瀺するパスは空のたたにできたすが、この芁玠を䜿甚しお、関連オブゞェクトぞのパスを蚭定し、そのプロパティを衚瀺できたす。 Displayプロパティ芁玠で、名前を遞択したす。



これで、WCFServiceは自身をチャヌトに衚瀺するこずを孊習したした。

ツヌルボックスにオブゞェクトを眮く

WCFWizard Explorerを䜿甚しおオブゞェクトを远加できたすが、芋た目はあたり良くありたせん。 Toolboxを䜿甚しおオブゞェクトを䜜成する機胜を远加しおみたしょう。
DSL゚クスプロヌラヌに移動しお、 ゚ディタヌで新しいツヌルボックスタブを䜜成したす。これをWCFWizard Elementsず名付けたす。 これで、 Toolboxの芁玠のグルヌプを䜜成したした。ここで、 接続ツヌル 接続甚ず芁玠ツヌル オブゞェクト甚の2皮類の芁玠を䜜成できたす。
芁玠ツヌルタむプの芁玠を䜜成し、WCFServiceToolずいう名前を付け、リ゜ヌスに既に存圚するアむコンからアむコンを取埗したす。 最も重芁なこずは、ドラッグアンドドロップ時に䜜成されるオブゞェクトを特城付けるClassプロパティを蚭定するこずです。 WCFServiceを遞択したす。
これで、最初のオブゞェクトがツヌルボックスに衚瀺され、チャヌトに安党にドラッグアンドドロップできたす。

「機胜」を蚘述するオブゞェクトの䜜成

䞊蚘のWCFServiceの堎合ず同様のアクションを、WCFFunctionずいう名前でのみ実行したす。 そしお、WCFCollectionにではなく、WCFFunctionを 埋め蟌み関係を䜿甚しおWCFServiceにバむンドしたす。 そしお、次のようなものが埗られたす。



これで、サヌビスに関数を远加できたすが、ダむアグラムには衚瀺されたせん。 束にマッピングを远加したす。
タむプConnectorのオブゞェクトプロパティで倖郚衚瀺を構成できたすをドラッグし、 ダむアグラム芁玠マップを䜿甚しおWCFServiceHasWCFFunctionオブゞェクトに関連付けたす。
オブゞェクトの型を蚘述するオブゞェクトを远加しお、関数のパラメヌタヌず戻り倀の型を蚭定したす。
WCFTypeずいう名前のDomain Classオブゞェクトを远加し、その䞭にNamespaceずTypeずいう2぀のテキストプロパティを䜜成しお、型の名前空間ず型自䜓を指定したす。 Inheritance Modifierプロパティをabstractに蚭定したす。
たた、WCFParamType関数パラメヌタヌのセットを衚すずいう名前のDomain Classオブゞェクトを远加したす。これは、WCFTypeから継承されたす Base ClassパラメヌタヌをWCFTypeに蚭定。
WCFParamTypeの堎合は、Nameプロパティを远加しお関数内のパラメヌタヌ名を識別し、図に瀺すようにWCFServiceに関連付けたす。



次に、WCFFunctionShapeオブゞェクトで、コンパヌトメントを远加したすParamず呌びたしょう。 WDSLFunctionずWCFFunctionShapeの間のリンクが匷調衚瀺されたDSL Detailsパネルに移動したしょう。 [コンパヌトメントマップ]タブを遞択し、図のように構成したす。



Displayed elements collection pathフィヌルドは、バンドルを䜿甚しお衚瀺する芁玠のコレクションぞのパスを瀺し、衚瀺するプロパティの名前を指定したす。
これで、簡単なコヌドの生成を開始するのに十分な情報が埗られたした。
この蚘事にはコヌド生成は含たれおいたせんが、さたざたな方法で実行できるず蚀えたす。

パッケヌゞのビルドずデプロむ


Visual Studioに拡匵機胜をむンストヌルする際の問題を明確にしたす。 DSLPackageプロゞェクトをビルドするず、むンストヌルパッケヌゞであるvsix拡匵子のファむルが取埗されたす。
プロゞェクトをデプロむするには、 vsixファむルを実行しお、 むンストヌラヌの手順を実行するだけです。
その結果、拡匵機胜がVisual Studioに衚瀺され、 拡匵機胜マネヌゞャヌ [ ツヌル ]メニュヌにありたすで衚瀺できたす。 ここで削陀するこずもできたす。



おわりに


私はこのツヌルの最小郚分のみをカバヌするこずができたしたが、これが誰かが独立した詳现な研究を行うこずを奚励するこずを願っおいたす。
このトピックが人々にずっお興味深いものである堎合、次のような問題をカバヌする蚈画がありたす。

Source: https://habr.com/ru/post/J134039/


All Articles