2011年11月9日水曜日

属性指定から IRegisterMetadata.Register へ

前回の LocBAML を利用した記事にあるように、現在拙作の WFDesignerExpress を多言語対応(といっても機械翻訳での対応ですが……)を行っています。その際に非常に感じたのは、クラスやプロパティに対して属性を設定するのではなく、IRegisterMetadata.Register メソッドにて属性の設定を行うようにするのが、WPF や WF でのプログラミングを行う際に適している、というところです。


まぁそれも多言語対応しないのであれば構わないのですが、もし属性でリソースに定義してある値を設定するケースも IRegisterMetadata.Register メソッドで処理を行う必要があります。属性設定では定数でなければならないため、リソースから取得して設定する、という事が許されません。
ロジックとしては次のようになります。

   1: Dim builder As New AttributeTableBuilder
   2: builder.AddCustomAttributes(GetType(CommentOutActivity),
   3:                     New DesignerAttribute(GetType(CommentOutActivityDesigner)),
   4:                     New ToolboxBitmapAttribute("Images/Activity/commentout.png")
   5:                     )
   6: MetadataStore.AddAttributeTable(builder.CreateTable)

以前にも書いた通り、クラスに属性を設定する場合はこのようなロジックで済みます。プロパティに属性を設定する場合では、次のようになります。

   1: Dim builder As New AttributeTableBuilder
   2: builder.AddCustomAttributes(GetType(ReadKeyActivity),
   3:                     New DesignerAttribute(GetType(ReadKeyActivityDesigner)),
   4:                     New ToolboxBitmapAttribute("Images/Activity/console_readkey.png")
   5:                     )
   6: builder.AddCustomAttributes(GetType(ReadKeyActivity), "InputKey",
   7:             New CategoryAttribute(GetResourceStrings("ACtRKPropertyCategory", "処理の設定")),
   8:             New DisplayNameAttribute(GetResourceStrings("ACtRKInputKeyProperty", "結果を受取る変数")),
   9:             New DescriptionAttribute(GetResourceStrings("ACtRKInputKeyDescription", "入力されたキーを受取る変数を設定します。")))
  10:  
  11: MetadataStore.AddAttributeTable(builder.CreateTable)
※上記サンプルソースの中において、GetResourceStrings メソッドはリソースから文言を取得するよう動作する自作のメソッドです

こちらでは ReadKeyActivity クラスの InputKey プロパティに対して属性を設定しています。
このように IRegisterMetadata.Register メソッド内部で属性を定義するようにしておくことが、WPF や WF でのプログラミングに適した形となっています。というのも、リソース用 Dll に上記メソッドを持つクラスが存在した場合、メソッドを呼び出してあげる事が MS 推奨の方式となっており、Visual Studio でもまず先にこの処理が行われることになっています。

(リソース用 Dll ではなく実行アセンブリの場合は、自分たちで上記メソッドを呼び出す必要があります)

WF ではメタデータに対して多くの情報を登録する必要があり、このあたりの方式を合わせておくことが後々楽になると思います。

0 件のコメント:

コメントを投稿