Forums: Discussion-Ouverte (Thread #35449)

【For.NET】画面の入力値以外の情報をBizLogicに渡す方法について (2014-05-15 16:11 by c-goto #73022)

こちらでは初めて投稿させていただきます。
よろしくお願いします。

現在、TERASOLUNA For .Net でクライアントアプリのシステム構築を行っております。

そこで質問なのですが、画面の入力値以外の情報をBizLogicに渡すにはどのように実装すればよいかの最適解を教えて頂きたいのです。

たとえば、とある画面に入力項目AとBが存在するとします。
同様のプロパティをViewDataに2つ定義し、データバインドします。
BizLogicが実行される際は、EventProcessWorkerによってInputDTOがインスタンス化され、ViewData→InputDTOへと値が自動コピーされ、BizLogicに渡されると認識しております。

その際に、BizLogicの要求データとしてその2つ以外の情報(たとえばフラグなど)を定義した場合、どこでその値をセットすればよいのでしょうか?

InputDTOはEventProcessWorkerにより自動的にインスタンス化されるため、View等で値を任意でセットすることは出来ないと思います。
自身のコードでDTOを生成し値をセットした上で、EventProcessWorkerに渡すことができれば可能だと思うのですが。。
(もしくはEventProcessWorkerに割り込みを掛ける?)

以上、FW勉強し始めにて的外れな質問をしているかもしれませんが、何卒よろしくお願いします。

Répondre à 73022×

You can not use Wiki syntax
Vous n'êtes pas connecté. Pour distinguer vos messages en provenance du reste, vous devez choisir un surnom. (L'unicité du surnom est pas réservé. Il est possible que quelqu'un d'autre pourrait utiliser exactement le même surnom. Si vous voulez l'assurance de votre identité, nous vous recommandons de vous connecter avant de poster.) Connexion

Re: 【For.NET】画面の入力値以外の情報をBizLogicに渡す方法について (2014-05-16 17:23 by sejimos #73036)

画面項目以外のデータをBizLogicに渡す方法としては、以下の4つが考えられます。

ただし、フレームワークの観点から、③は非推奨です。
ご質問の要件であれば、①または②で実現するのが妥当かと考えます。

① ViewDataで画面項目以外のデータを受け渡す

以下のように定義し、項目Cは画面項目とバインドさせない

[View]
項目A
項目B

[ViewData]
項目A
項目B
項目C

[InputDto]
項目A
項目B
項目C

◆メリット
 自動でコピーされるため、コーディングレスでデータをセットできる
◆デメリット
 ViewDataの仕様上、項目Cはstring属性またはValidatableNestedViewData継承クラスである必要がある
 ViewDataにプロパティを多く定義しすぎると、自動コピーによる性能面への影響が懸念される

② EventProcessWorkerのBuiltRequestイベントで受け渡す
【参考】CL-03 イベント処理実行機能.pdf 33ページ目以降

以下のように、項目CはDtoにのみ定義する

[View]
項目A
項目B

[ViewData]
項目A
項目B

[InputDto]
項目A
項目B
項目C

BuiltRequestイベントで以下のように、データをセットする

private void eventProcessWorker_BuiltRequest(object sender, RequestDataBuiltEventArgs e)
{
var inputDto = e.RequestData as XXXXInputDto;
inputDto.dtoFlg = viewFlg;
}

◆メリット
 ViewDataの仕様上の制約を受けないため、boolなど任意のデータ型を受け渡すことができる
◆デメリット
 自動でコピーされないため、View側でコーディングする必要がある

③ BizLogicで直接Viewからデータを取得する
【参考】CL-03 イベント処理実行機能.pdf 64ページ目

以下のように、項目CはDtoにも定義しない

[View]
項目A
項目B

[ViewData]
項目A
項目B

[InputDto]
項目A
項目B

BizLogicで以下のように、Viewを取得する

public OutputDto Execute(InputDto input)
{
var view = InvocationScope.Current.GetContext<EventProcessContext>().TargetForm as XXXXView;
if (view != null)
bizlogicFlg = viewFlg;
}

◆メリット
 ViewDataの仕様上の制約を受けないため、boolなど任意のデータ型を受け渡すことができる
 View側のコードが複雑な場合に、Viewとは切り離した形でデータの受け渡しを実装できる
◆デメリット
 MVCの境界が曖昧となってしまうため、BizLogicからViewを参照すべきではない

④ グローバル変数を利用して受け渡す
【参考】http://www.techscore.com/tech/DesignPattern/Singleton.html/

事前にsingltonまたはstaticなオブジェクトにデータをセットしたうえで、BizLogicでデータを取得する
フレームワークとしては提供しておらず、自前で実装する必要がある
# FormForwardManagerで「スコープ内共通データ領域」を提供しているが、
# これはスコープ内の複数のViewでデータを共有するものであり、今回の要件とは合致しません

◆メリット
 ViewDataやInputDtoに紐づかない、アプリケーション内で共通的に扱うべきデータをハンドリングしやすい
 # たとえば、アプリケーションを実行しているユーザ情報のような、トランザクションとは関係のないデータ
◆デメリット
 扱うべきデータがステートフル/ステートレスかを検討したうえで、実装する必要がある
Répondre à #73022

Répondre à 73036×

You can not use Wiki syntax
Vous n'êtes pas connecté. Pour distinguer vos messages en provenance du reste, vous devez choisir un surnom. (L'unicité du surnom est pas réservé. Il est possible que quelqu'un d'autre pourrait utiliser exactement le même surnom. Si vous voulez l'assurance de votre identité, nous vous recommandons de vous connecter avant de poster.) Connexion

Re: 【For.NET】画面の入力値以外の情報をBizLogicに渡す方法について (2014-05-29 13:57 by c-gotou #73212)

sejimos様

ご回答ありがとうございます。
返信遅くなりまして申し訳ございません。

> ① ViewDataで画面項目以外のデータを受け渡す
>
> 以下のように定義し、項目Cは画面項目とバインドさせない
>
> [View]
> 項目A
> 項目B
>
> [ViewData]
> 項目A
> 項目B
> 項目C
>
> [InputDto]
> 項目A
> 項目B
> 項目C
>
> ◆メリット
>  自動でコピーされるため、コーディングレスでデータをセットできる
> ◆デメリット
>  ViewDataの仕様上、項目Cはstring属性またはValidatableNestedViewData継承クラスである必要がある
>  ViewDataにプロパティを多く定義しすぎると、自動コピーによる性能面への影響が懸念される

確かにViewDataにはstringかValidatableNestedViewDataしか定義してはいけないとありますね。
私が最初に思いついたものがこれなのですが、そもそもViewDataの仕様として画面に表示されないような情報を定義すること自体TERASOLUNA 的にOKなのか疑問で、今回質問させていただきました。

たとえば、画面に表示しないが裏でデータを持ちたいような場合で、且つ独自のクラスで保持したい場合、ViewDataにstringかValidatableNestedViewData以外のメンバ変数をバインドさせない形で定義しても問題ないのでしょうか?

> ② EventProcessWorkerのBuiltRequestイベントで受け渡す
> 【参考】CL-03 イベント処理実行機能.pdf 33ページ目以降
>
> 以下のように、項目CはDtoにのみ定義する
>
> [View]
> 項目A
> 項目B
>
> [ViewData]
> 項目A
> 項目B
>
> [InputDto]
> 項目A
> 項目B
> 項目C
>
> BuiltRequestイベントで以下のように、データをセットする
>
> private void eventProcessWorker_BuiltRequest(object sender, RequestDataBuiltEventArgs e)
> {
> var inputDto = e.RequestData as XXXXInputDto;
> inputDto.dtoFlg = viewFlg;
> }
>
> ◆メリット
>  ViewDataの仕様上の制約を受けないため、boolなど任意のデータ型を受け渡すことができる
> ◆デメリット
>  自動でコピーされないため、View側でコーディングする必要がある

この方法が一番今回の要求に合致しそうですね。
イベントのハンドリングが若干大変そうではありますが、
こちらの方法で検討し、サンプル実装してみます。

> ③ BizLogicで直接Viewからデータを取得する
> 【参考】CL-03 イベント処理実行機能.pdf 64ページ目
>
> 以下のように、項目CはDtoにも定義しない
>
> [View]
> 項目A
> 項目B
>
> [ViewData]
> 項目A
> 項目B
>
> [InputDto]
> 項目A
> 項目B
>
> BizLogicで以下のように、Viewを取得する
>
> public OutputDto Execute(InputDto input)
> {
> var view = InvocationScope.Current.GetContext<EventProcessContext>().TargetForm as XXXXView;
> if (view != null)
> bizlogicFlg = viewFlg;
> }
>
> ◆メリット
>  ViewDataの仕様上の制約を受けないため、boolなど任意のデータ型を受け渡すことができる
>  View側のコードが複雑な場合に、Viewとは切り離した形でデータの受け渡しを実装できる
> ◆デメリット
>  MVCの境界が曖昧となってしまうため、BizLogicからViewを参照すべきではない

BizLogicからViewを参照するのは依存性が高くなってしまうため、
ユニットテストを行う上でも好ましくないですね。
今回はパスします。

> ④ グローバル変数を利用して受け渡す
> 【参考】http://www.techscore.com/tech/DesignPattern/Singleton.html/
>
> 事前にsingltonまたはstaticなオブジェクトにデータをセットしたうえで、BizLogicでデータを取得する
> フレームワークとしては提供しておらず、自前で実装する必要がある
> # FormForwardManagerで「スコープ内共通データ領域」を提供しているが、
> # これはスコープ内の複数のViewでデータを共有するものであり、今回の要件とは合致しません
>
> ◆メリット
>  ViewDataやInputDtoに紐づかない、アプリケーション内で共通的に扱うべきデータをハンドリングしやすい
>  # たとえば、アプリケーションを実行しているユーザ情報のような、トランザクションとは関係のないデータ
> ◆デメリット
>  扱うべきデータがステートフル/ステートレスかを検討したうえで、実装する必要がある

こちらもコードが煩雑化する恐れがあるため、
今回はパスかと思います。

以上、よろしくお願いします。

Répondre à #73036

Répondre à 73212×

You can not use Wiki syntax
Vous n'êtes pas connecté. Pour distinguer vos messages en provenance du reste, vous devez choisir un surnom. (L'unicité du surnom est pas réservé. Il est possible que quelqu'un d'autre pourrait utiliser exactement le même surnom. Si vous voulez l'assurance de votre identité, nous vous recommandons de vous connecter avant de poster.) Connexion

Re: 【For.NET】画面の入力値以外の情報をBizLogicに渡す方法について (2014-06-07 11:16 by sejimos #73338)

返信が遅くなりすみません。

>たとえば、画面に表示しないが裏でデータを持ちたいような場合で、且つ独自のクラスで保持したい場合、
>ViewDataにstringかValidatableNestedViewData以外のメンバ変数をバインドさせない形で定義しても問題ないのでしょうか?
フレームワークとしては上記のような使い方をしても問題ありません。
イベント処理時のデータコピーも正常に行われます。

よろしくお願い致します。

Répondre à 73338×

You can not use Wiki syntax
Vous n'êtes pas connecté. Pour distinguer vos messages en provenance du reste, vous devez choisir un surnom. (L'unicité du surnom est pas réservé. Il est possible que quelqu'un d'autre pourrait utiliser exactement le même surnom. Si vous voulez l'assurance de votre identité, nous vous recommandons de vous connecter avant de poster.) Connexion

Re: 【For.NET】画面の入力値以外の情報をBizLogicに渡す方法について (2014-06-07 14:34 by c-goto #73343)

> フレームワークとしては上記のような使い方をしても問題ありません。
> イベント処理時のデータコピーも正常に行われます。

ご返信ありがとうございます。
早速実装のほう調査してみようと思います。
Répondre à #73338

Répondre à 73343×

You can not use Wiki syntax
Vous n'êtes pas connecté. Pour distinguer vos messages en provenance du reste, vous devez choisir un surnom. (L'unicité du surnom est pas réservé. Il est possible que quelqu'un d'autre pourrait utiliser exactement le même surnom. Si vous voulez l'assurance de votre identité, nous vous recommandons de vous connecter avant de poster.) Connexion