Castle MonoRailのDataBinder / SmartDispatcherControllerを取得して、インターフェイスであるプロパティを含む型に対してバインドする方法は?
-
08-07-2019 - |
質問
ドメインモデルでエンティティクラスを表すためにインターフェイスを使用しています。 LinqToSqlを使用することにより、これらの具体的な実装があります。サービスレイヤーが新しいエンティティをインスタンス化するために使用する各LinqToSqlクラスにファクトリーメソッドを追加しました(注:コントローラーのDataBind属性ではなく)。
MonoRailのデフォルトのDataBinder実装は、インターフェースとして定義されているプロパティを無視します。
理想的には、MonoRailでデータ層クラスをインスタンス化したくありません。インターフェースの要点はこれらの懸念を分離することです。
また、レイヤー間で翻訳することだけが仕事である、LinqToSql以外の具象クラスの別のセットを作成したくありません。
本当に長い一日の終わりです。誰かが慈悲を持って、私たちが自分の実装でオーバーロードする必要があるIDataBinderの部分を教えてくれますか、または他の試みを試みる可能性がありますか? ;-)
解決
IParameterBinderを確認する必要があります。 このテーマについて書いた投稿
他のヒント
Kenが指摘したように、カスタムIParameterBinderを使用してアイデアを実装できます。
解決策は、IOCを使用することです。
- インターフェイスからフォームの具体的なインスタンスを解決します
- IDataBinderを使用して、インスタンスを要求パラメーターにバインドします
もう1つはIDictionaryAdapterを使用します:
- インターフェイスのdtoプロキシを生成します
- IDataBinderを使用して、dtoプロキシインスタンスを要求パラメーターにバインドします
NB:インターフェイスの場合、2番目のオプションは機能しません:
- 公開されていません(ハム)
- メソッドがあります
- またはイベント
- または読み取り専用プロパティ
- またはsetonlyプロパティ
最後に、コントローラーの署名で具体的なクラスを公開する際の問題が何なのかわかりません。
私自身は、アプリケーション層サービスで定義されたインターフェースを実装するコントローラーで具体的なフォームを使用しています。
- コントローラー側はHttpマッピングであり、フォーム/コマンドの最初のレベルのデータ検証です
- アプリケーション層サービスは、ビジネスの検証とフォーム/コマンドの処理です