OutsystemsでC#を書いてみた

#やったこと
* 簡単な2項の足し算をするコードをC#で書いて、それをOutSystemsのロジック内で呼び出して使ってみた
* Structure型のRecordをC#に渡してみることにも挑戦してみた

#想定読者
初歩的なOutsystemsの操作は何となくわかるが、C#でExtensionを書いたことはない・どうやって書くか知りたい人

#開発環境
* Outsystems11(ServiceStudio, IntegrationStudio)
* Vidual Studio

#筆者のスキル
C#の詳しいことは全然わからん　outsystemsも初心者

#手順

###C#のコードを書く（Extension）
* 任意のApplication内に、Extentsionを作成する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471875/fe7a23eb-225b-871b-8b52-a3a0791b556f.png)

* Create Moduleボタンを押すと、勝手にIntegrationStudioが開いて、EnvironmentのPasswordを聞かれるのですなおに入力する
* 以下のような画面が開くので必要ならDescriptionを書く


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471875/1da2ef6c-540a-16e9-8c75-c2c6746ec3bc.png)

* 左のツリーのActionsフォルダを右クリックして、Add Actionをクリック
* 以下の図のように、Actionの引数や戻り値を設定できる画面になるので、それぞれ入力する
* 今回は、2つの項目の引数を受け取って計算結果を返却するアクションを作成するので、以下のようなParametersを設定した


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471875/e509d031-4ad1-6667-73e9-1f70076d171b.png)


* 左上のFileメニューを開いて、Edit Sourcecode .NETを選択する


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471875/613cb3ff-ca9d-f90b-d555-7fd884fffaa2.png)


* 勝手にVisual Studioが開く
* 右側のソリューションエクスプローラーでCaluculation.csを開くと先ほど入力した引数や戻り値などは勝手に補完してくれていることがわかる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471875/7fa2a837-0347-fbaf-f538-ce65e3c2eca2.png)

```// TODO: Write implementation for action```
というコメントの下に今回やりたかった足し算のコードを入力する
```ssResult = ssFirstTerm + ssSecondTerm;```

* コードが入力し終わったら、ファイルを保存してVisual Studioを閉じる
* IntegrationStudioに戻って、1Click Publishボタンを押す（下図）

<img width="476" alt="無題.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471875/87923b8e-2813-3442-9bce-8d596d43a4ab.png">


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471875/c623bc76-eaf9-50aa-407b-00be45e32412.png)


* Publishが終わってからServiceStudioに戻ると、ちゃんとExtensionが作成されてIntegrationStudioで作ったモジュールが反映されていることが確認できる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471875/44779cd5-0949-d88a-e84d-fa12ecec7716.png)


###ServiceStudio側でExtensionを呼び出す
* 下図のような画面を作って、FirstTermとSecondTermというLocalVariableを用意して、Inputの値が入るように設定する
* Additionボタンを押すとC#で書いたアクションを呼び出すためのScreenAction(Addition)を呼び出すように設定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471875/570f99e4-945c-fef9-e254-0ccd6d33162b.png)

* C#で書いたアクションのDependencyを貼る

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471875/ed9572a7-2e18-c50c-f263-85e9546a7021.png)


* 呼び出して使ってみる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471875/504fe3e8-3274-f8f7-cf5e-51b975105c39.png)

* Publishして計算させてみるとこんな感じで計算結果が正しく表示された

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471875/55f7c856-d839-6480-f607-48aff62cb9f0.png)



#OutsystemsのStructureをC#に渡したい場合はどうするの？
* IntegrationStudioでStructureを定義するとその型でレコードを受け取れるようになる
* こんな感じで定義できて
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471875/95b2de08-eb87-b9d8-8078-fe585e7aa5a6.png)


* VisualStudioで見るとStructures.csに勝手にコードを書いてくれてる　すごーい！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471875/8018606c-2f63-b1f1-42d3-2ad7b546124d.png)

* EditStructure.csで、Nameの値がfooかどうか見てあげる（C#わかんない）
書いたのはこれだけ

```c#:EditStructure.cs
public void MssGetStructureAndValidateValue(RCStructureRecord ssStructure, out bool ssResult) {
  ssResult = false;
  String ValueForCompare = "foo";
  if (ssStructure.ssSTStructure.ssName.Equals(ValueForCompare))
  {
    ssResult = true;
  }
} // MssGetStructureAndValidateValue
```


* ServiceStudioで組み込む
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471875/d6cd9f6f-b6f8-0108-117a-9097e1c6baa6.png)




* Nameにfooが入力されたらOK　それ以外ならNGが表示させることができたよ！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471875/b17100cc-e0f4-9deb-2579-abf9521482c6.png)