我是MEF的新手,我正在尝试使用它来构建一个插件系统,但我仍然坚持第一步.
我正在关注Andrew Whitechapel的一篇文章.我已经下载了他的示例代码并运行正常(如果你删除了一个"导出"程序集 - 它们在他的示例中是互斥的 - 并引用了MEF程序集).
该示例说明了导入单个零件.我想导入多个部分(全部基于相同的界面).所以,我更改示例代码如下:
[Import]
// OLD - public Interface.ICalculate Calculate { get; set; }
public IEnumerable<Interface.ICalculate> Calculators { get; set; }
// OLD - Console.WriteLine(
// OLD - String.Format("{0}", Calculate.Circumference(4)));
foreach (Interface.ICalculate calculator in Calculators)
{
Console.WriteLine(
String.Format("{0}", calculator.Circumference(4)));
}
Run Code Online (Sandbox Code Playgroud)
我还为IEnumerable导入了System.Collections.Generic.
关键变化是第一个.据我了解,这将允许我从多个组件导入零件.但是,我收到以下错误:
No valid exports were found that match the constraint
Run Code Online (Sandbox Code Playgroud)
此时我甚至没有添加多个"插件"程序集.仍然只有一个.
为了完整性,这里是他的"插件"类库中的导出定义(我没有触及):
[Export(typeof(Interface.ICalculate))]
public class Calculate : Interface.ICalculate
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?我在这里挠头.我搜索了SO和MEF论坛,但可以找到任何启发我的东西.
我正在使用VS 2008 SP1(未安装2010 beta)和最新的System.ComponentModel.Composition程序集(2009.26.8.0).
MEF预览版5改变了这一点.您现在需要使用ImportManyAttribute而不是ImportAttribute:
[ImportMany]
public IEnumerable<Intertface.ICalculate> Calculators { get; set; }
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1930 次 |
| 最近记录: |