【发布时间】:2013-07-28 04:48:53
【问题描述】:
我正在尝试增强我当前使用 C# MEF 建立的程序集。由于这些程序集已经在生产中使用,因此直接修改各个类目前不是可行的方法。我主要是在现有的行为中添加新的行为。例如我有:
public IExtension
{
Object Execute();
}
public BaseExtension : IExtension
{
// other methods and members
public virtual Object Execute()
{
// do operations here.
}
}
[Export(typeof(IExtension)]
public AppRecordExtension : BaseExtension
{
// .. other methods and members
public override Object Execute()
{
base.Execute(); // shown just for example..
this.someOperation();
}
}
// other extensions made.
现在,当 MEF 容器在驱动程序的方法中调用扩展时,上述方法有效:
[ImportMany(typeof(IExtension)]
private IEnumerable<Lazy<IExtension>> operations;
public void ExecuteExtensions()
{
var catalog = new AggregateCatalog( new AssemblyCatalog(Assembly.GetExecutingAssembly()), new DirectoryCatalog("extensions", ".dll"));
CompositionContainer container = new CompositionContainer(catalog);
container.ComposeParts(this);
Dictionary<IExtension, object> result = new Dictionary<IExtension, object>();
foreach(Lazy(IExtension> extension in operations)
{
result.Add((extension.Value, extension.Value.Execute());
}
}
但是,如果我想为 IExtension 或 BaseExtension 实现特定的装饰器,我不知道应该将它们放在容器中的哪个位置,或者我应该如何将属性放在装饰器上,以便所有原始 IExtension 具体类加载并执行附加行为。 IExtension 装饰器示例:
// do I put an attribute here?
// if an attribute is put here, how does the MEF container call it?
public BatchableExtension : BaseExtension
{
private IExtension extension = null;
public BatchableExtension( IExtension extension)
{
this.extension = extension;
}
public override Object Execute()
{
this.extension.Execute();
doSomeBatchSpecificOperation();
}
}
// do I put an attribute here?
// if an attribute is put here, how does the MEF container call it?
public MonitoringExtension : BaseExtension
{
private IExtension extension = null;
public MonitoringExtension( IExtension extension)
{
this.extension = extension;
}
public override Object Execute()
{
this.extension.Execute();
doSomeMonitoringSpecificOperation();
doSomeMoreBehaviors();
}
有人可以帮忙吗?我想确保当容器拾取扩展时,新行为也会被拾取,具体取决于传递的参数(例如,如果 isBatchable = true,添加 BatchableExtension 等)。如果它是非 MEF,则上面的内容类似于:
public void Main(String[] args)
{
IExtension ext = new AppRecordExtension();
// this is the part where I want to simulate when I use MEF.
IExtension ext2 = new MonitoringExtension(new BatchableExtension(ext));
ext2.Execute();
}
【问题讨论】:
-
您显示的是
IExtension,但IBaseExtension来自哪里?你的意思是什么:“现在,当 MEF 容器调用扩展时,上面的工作。” -
IBaseExtension 是我的错字,现在更正了。我还更新了原始帖子以证明我的意思。基本上,当使用'vanilla' MEF 时,扩展的发现和执行工作。但是,当我添加一些装饰器模式实现(这是我在 Main() 部分中显示的)时,我被卡住了。
-
结果字典如何被扩展填充?
-
我主要按照这篇文章的例子:codeproject.com/Articles/432069/…
标签: c# design-patterns mef decorator