Я только начал использовать MEF и столкнулся с ранней проблемой.
У меня есть интерфейс под названием DataService:
namespace DataAccess
{
interface IDataService
{
string Name { get; }
string Description { get;}
List<String> GetPeople();
}
}
Существует 2 реализации этого интерфейса, одна для SQLСервер и один для 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
}
}
Свойства имени и описания теперь больше не существуют, поскольку я заменил их метаданными.Как видите, это очень простые объекты, я хотел убедиться, что смогу заставить это работать до того, как начну выполнять тяжелую работу.
Вот код, который я использую для обнаружения сборок:
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());
}
Произошла ошибка:
Композиция вызвала единственную ошибку композиции.Основная причина приведена ниже.Для получения более подробной информации просмотрите свойство CompositionException.Errors.
1) Экспорт «DataAccess.Oracle (ContractName =" DataAccess.IDataService ")" нельзя назначить типу «DataAccess.IDataService».
В результате: невозможно установить импорт 'MEFTest.Form1.services (ContractName = "DataAccess.IDataService") "для части" MEFTest.Form1 ".Элемент: MEFTest.Form1.services (ContractName = "DataAccess.IDataService") -> MEFTest.Form1
Кажется, нет никакого смысла в том, что он не может назначить интерфейсу, который был разработанfor!
Как только эта проблема будет решена, моя следующая проблема - как выбрать один и получить его экземпляр ...