gpt4 book ai didi

c# - 导出部件的 MEF 实例化

转载 作者:太空狗 更新时间:2023-10-30 01:23:30 26 4
gpt4 key购买 nike

首先,简单的问题。

当 MEF (System.ComponentModel.Composition) 创建部件的实例时,是否可以接收到 事件?发生这种情况时,我想反射(reflect)创建的对象并连接各种属性。在 Spring.Net 中,这可以通过 IObjectPostProcessor 接口(interface)实现。

背景是我试图在 MEF 中实现发布者/订阅者模式。订阅者类基本上是这样做的:

class MyContoller
{
[Command("Print")]
public void Print() { ... }

[Command("PrintPreview")]
public void PrintPreview() { ... }
}

我想检测 MyController 何时被实例化并连接具有 CommandAttribute任何方法

发布者(例如菜单项)将执行 Command.Get("Print").Fire() 来发布上述事件。

第二个问题

也许 MEF 中有一个我遗漏的替代模式!!!

我看过一些关于 MEF, Prism and the 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;
}

最佳答案

这可能无济于事,但零件本身可以在完全组合时收到通知:

Automatically call method after part has been composed in MEF

此外,您可能已经知道这一点(并且它可能与您正在尝试做的事情并不真正相关),但是您可以装饰您的导出和导入,以便命名具体实现。所以,你可以有一个像这样的导出类:

[Export("Print", typeof(IPlugin))]
[PartCreationPolicy(CreationPolicy.Shared)]
class Print : IPlugin
{
.
.
.
public Fire()
{
//Do something;
}
}


class PrintMenuItem
{
IPlugin _plugin;

[ImportingConstructor]
PrintMenuItem([Import("Print", typeof(IPlugin)] plugin)
{
_plugin = plugin;
}

void Execute()
{
_plugin.Fire();
}

}

关于c# - 导出部件的 MEF 实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11088160/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com