MEF'导出不能分配给'错误'

her*_*iod 6 c# mef

我刚开始使用MEF并且遇到了早期问题.

我有一个名为DataService的接口:

namespace DataAccess
{
  interface IDataService
  {
    string Name { get; }
    string Description { get;}

    List<String> GetPeople();
  }
}
Run Code Online (Sandbox Code Playgroud)

此接口有2个实现,一个用于SQL Server,另一个用于Oracle.下面是Oracle实现,SQL Server实现完全一样.

namespace DataAccess
{
[Export(typeof(IDataService))]
[ExportMetadata("Name","Oracle")]
[ExportMetadata("Description","Oracle Data Service")]
public class Oracle : IDataService
{

    #region IDataService Members

    public string Name
    {
        get { return "Oracle"; }
    }

    public string Description
    {
        get { return "Provides data access to Oracle database"; }
    }

    public List<string> GetPeople()
    {
        return new List<String>() { "Oracle boo", "Oracle boo1" };
    }

    #endregion
}
}
Run Code Online (Sandbox Code Playgroud)

名称和描述属性现在已不存在,因为我已将其替换为元数据.正如你所看到的,它们是非常简单的对象,我想确保在我开始努力工作之前能够让它工作.

这是我用来发现程序集的代码:

    private static CompositionContainer _container;
    private const string ASSEMBLY_PATTERN = "*.dll";
    private AggregateCatalog _catalog; 

    [ImportMany]
    IEnumerable<DataAccess.IDataService> services { get; set; }

    private void button3_Click(object sender, EventArgs e)
    {


        _catalog = new AggregateCatalog(
            new DirectoryCatalog(txtLibPath.Text, ASSEMBLY_PATTERN),
            new AssemblyCatalog(Assembly.GetExecutingAssembly()));
        _container = new CompositionContainer(_catalog);
        _container.ComposeParts(this);
        MessageBox.Show(services.Count().ToString());
    }
Run Code Online (Sandbox Code Playgroud)

这是产生的错误:

该组合物产生单一组成误差.根本原因如下.查看CompositionException.Errors属性以获取更多详细信息.

1)导出'DataAccess.Oracle(ContractName ="DataAccess.IDataService")'不能分配给'DataAccess.IDataService'类型.

导致:无法在部分'MEFTest.Form1'上设置导入'MEFTest.Form1.services(ContractName ="DataAccess.IDataService")'.元素:MEFTest.Form1.services(ContractName ="DataAccess.IDataService") - > MEFTest.Form1

它似乎没有任何意义,它不能分配给它的设计接口!

一旦这个问题得到解决,我的下一个问题是如何选择一个并得到它的实例......

Dan*_*ted 6

看起来您的合同程序集的两个不同版本(带有DataAccess.IDataService的版本)正在加载.一个可能来自您的可执行路径,另一个来自您的插件路径.我在关于如何调试和诊断MEF故障的博客文章中稍微讨论了这个问题,并且有关装配加载最佳实践的MSDN页面更详细.