まずは素朴な疑問。
event
MEF (System.ComponentModel.Composition) がパーツのインスタンスを作成するときに を受け取ることはできますか? これが発生した場合、作成されたオブジェクトを反映して、さまざまな属性を関連付けたいと考えています。Spring.Net では、これはIObjectPostProcessor
インターフェースで可能です。
背景は、MEF でパブリッシャー/サブスクライバー パターンを実装しようとしているということです。基本的に、サブスクライバー クラスはこれを行います。
class MyContoller
{
[Command("Print")]
public void Print() { ... }
[Command("PrintPreview")]
public void PrintPreview() { ... }
}
そして、いつ MyController がインスタンス化されたかを検出し、CommandAttribute
.
メニュー項目などのパブリッシャーはCommand.Get("Print").Fire()
、前述のイベントをパブリッシュします。
2 番目の質問
MEF には、私が見逃している別のパターンがあるかもしれません!!!
MEF、Prism、および Event Aggregateに関するいくつかの投稿を見てきましたが、かなり複雑に見えます。
ご参考までに
参考までに、Spring.Net 実装のオリジナルを次に示します。
class CommandAttributeProcessor : IObjectPostProcessor
{
static ILog log = LogManager.GetLogger(typeof(CommandAttributeProcessor));
public object PostProcessAfterInitialization(object instance, string objectName)
{
foreach (MethodInfo methodInfo in instance.GetType().GetMethods())
{
foreach (CommandAttribute attr in methodInfo.GetCustomAttributes(typeof(CommandAttribute), true))
{
if (log.IsDebugEnabled)
log.Debug(String.Format("Binding method '{0}.{1}' to command '{2}'.", instance.GetType().Name, methodInfo.Name, attr.CommandName));
Command command = Command.Get(attr.CommandName);
command.Execute += (EventHandler) Delegate.CreateDelegate(typeof(EventHandler), instance, methodInfo);
}
}
return instance;
}
public object PostProcessBeforeInitialization(object instance, string name)
{
return instance;
}
}