我刚开始使用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
它似乎没有任何意义,它不能分配给它的设计接口!
一旦这个问题得到解决,我的下一个问题是如何选择一个并得到它的实例......
看起来您的合同程序集的两个不同版本(带有DataAccess.IDataService的版本)正在加载.一个可能来自您的可执行路径,另一个来自您的插件路径.我在关于如何调试和诊断MEF故障的博客文章中稍微讨论了这个问题,并且有关装配加载最佳实践的MSDN页面更详细.
| 归档时间: |
|
| 查看次数: |
3733 次 |
| 最近记录: |