gpt4 book ai didi

.net - 在 MEF 中未将遗留对象归类为导出时获取要导入的遗留对象

转载 作者:行者123 更新时间:2023-12-02 02:35:25 25 4
gpt4 key购买 nike

我开始使用 MEF 构建基于插件的应用程序,并且我正在慢慢将 MEF 添加到组合中。有很多现有代码还没有任何 MEF DNA,但我仍然想将这些代码放入由组合自动创建的新对象中。

让我们具体化。

我有一个对象列表,这些对象实现了 IFoo 接口(interface)并以特定但有用的方式在应用程序模型上运行。

interface IFooCool : IFoo {}

class FooCool : IFooCool {...}

interface IFooAwesome : IFoo {}

class FooAwesome : IFooAwesome {}

IEnumerable<IFoo> fooCollection = ProvidedTheOldFashionWay(not, yet, MEF);

现在,我想创建一些有用的工具,将 IFooX 界面映射到各种用户操作,如菜单命令或按钮点击。

[Export(ITool)]
class CoolTool : ITool
{
IFooCool _fooCool;
[ImportingConstructor]
CoolTool(IFooCool fooCool)
{
_fooCool = fooCool;
}

[Export(MenuAction)]
void DoSomething() { _fooCool.SomeWork(...); }
}

这是我想做的:

var batch = new CompositionBatch();
foreach(var foo in fooCollection)
{
batch.AddPart(foo); //add those legacy objects to the batch
}

var catalog = new TypeCatalog(typeof(CoolTool)); //or assembly or directory, ...
var container = new CompositionContainer(catalog);

container.Compose(batch);

CoolTool 将被实例化,FooCool 遗留对象将被传递给它。然后我可以获得导出的函数并在菜单中很好地显示它们,然后我们就可以开始了。当用户单击菜单项时,新的 CoolTool 将使用 IFooCool 界面的现有功能来做一些事情,嗯,很酷。

当然,那是行不通的。由于遗留对象未归因于导出,因此将它们添加到合成批处理中无济于事。在上面的代码中,我使用 batch.AddPart(object) 而不是 batch.AddPart(ComposablePart) 将 foo 实例添加到批处理中。第一种方法使用属性模型从对象中发现可组合信息。

如何使用第二个重载?我可以将现有的非 MEF 对象即时包装在 ComposablePart 中吗?像这样的东西:

batch.AddPart(CreateComposablePart(typeof(IFooCool), foo));

顺便说一句,我在非 silverlight 应用程序中使用预览版 8。

最佳答案

看起来您正在尝试调用此扩展方法:

AttributedModelServices.AddExportedValue<T>(
this CompositionBatch batch,
string contractName,
T exportedValue);

你的问题是你在运行时只知道类型参数T;这是你字典的关键。一种解决方案可能是使用反射来调用方法,这使您能够在运行时填写类型参数。首先,像这样获取泛型方法的 MethodInfo:

MethodInfo genericAddExportedValue = 
typeof(AttributedModelServices).GetMethods()
.Where(x=>x.Name == "AddExportedValue")
.First(x=>x.GetParameters().Count() == 3);

现在您可以关闭循环中的类型参数并调用该方法:

foreach(var entry in _registeredFoos)       
{
MethodInfo addExportedValue =
genericAddExportedValue.MakeGenericMethod(entry.Key);
addExportedValue.Invoke(
null,
new object[] {batch, entry.Key.FullName, entry.Value});
}

或者,您可以创建抽象 ExportProvider 类的实现,它知道如何使用您的 _registeredFoos 字典来提供导出。但这可能需要做更多的工作。

关于.net - 在 MEF 中未将遗留对象归类为导出时获取要导入的遗留对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2030978/

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