IActionとカスタム属性
3/20の日記で書いたIActionインタフェースをGUIに結びつける方法だけど
設定情報はなんでもいいけど最初の候補はさんざん日記で書いてきたApp.configだろう。 プロパティの数を考えると結構な記述量になる可能性があるので他の.configファイルとして別ファイルにしたりManifestResourceにしても良いだろう。
むろんコードと外部からの設定が出来るのは当たり前な事としてその他の方法として
こんな感じでカスタム属性を使うといいんじゃないかと考えている。
[Contribute(ContributeType = MENU, SiblingMenu = "file")] [Contribute(ContributeType = TOOLBAR, ContributeAlignment = Alignment.HEAD)] public class ExitAction : AbstractActionTemplate, IAciton { private Form form; public ExitAction(Form form) :base(form) { this.Text = "終了(&x)"; this.ShortcutKey = Keys.Control | Keys.W; this.ToolTipText = "アプリケーションを終了します"; this.Image = Util.GetImage("Image.exit.gif"); this.form = form; } public override void Run() { this.form.Close(); this.form.Dispose(); } }
ExitActionは単純に対象のフォームを閉じる処理をIActionの実装クラスとした例だけど
クラスの実装だけではこのクラスはどのGUIに関連付くのかは当然解らない。
しかしクラスに設定されたカスタム属性を見ればこのクラスが何のGUIに結びつけられるか
はなんとなく解るだろう。(というか解るように自己記述的でなくてはならないのだ)
フレームワーク(DIコンテナ)はこのカスタム属性を解釈してExitActionのインスタンスを
指定されたGUIに結びつける処理が必ず必要だぞ、と。