Если вы хотите использовать разные экземпляры одного и того же интерфейса в зависимости от некоторой логики (применить шаблон стратегии) в MEF, один из способов использовать атрибут ExportMetadata.
Например, если у вас есть IDbManager и если у вас есть две реализации, скажем, один Oracle и один Sql, то
1. Создайте интерфейс метаданных, который будет содержать метаданные
public interface IDbManagerMetadata
{
DataProvider DataProvider { get; }
}
2. Создайте класс атрибутов, как показано ниже
[MetadataAttribute]
public class DbManagerMetadataAttribute : Attribute, IDbManagerMetadata
{
public DataProvider DataProvider { get; set; }
}
Пример стратегии
публичное перечисление DataProvider
{
Oracle,
Sql,
}
[InheritedExport]
открытый интерфейс IDbManager
{
void Initialize ();
}
[InheritedExport (TypeOf (IDbManager))]
открытый класс DbManager: IDbManager
{
public DbManager (DataProvider providerType)
{
_providerType = providerType;
}
public void Initialize()
{
Console.WriteLine("provider : {0}", _providerType);
}
public DataProvider _providerType { get; set; }
}
И две разные реализации
[Export(typeof(IDbManager))]
[DbManagerMetadata(DataProvider = DataProvider.Oracle)]
public sealed class OracleDataProvider : DbManager
{
public OracleDataProvider():base(DataProvider.Oracle)
{
}
}
и
[Export(typeof(IDbManager))]
[DbManagerMetadata(DataProvider = DataProvider.Sql)]
public sealed class SqlDataProvider : DbManager
{
public SqlDataProvider()
: base(DataProvider.Sql)
{
}
}
И вы можете решить, какой из них использовать, используя интерфейс метаданных, который мы создали на первом шаге, как показано в репозитории, показанном ниже
[Export]
public class Repository
{
private IDbManager _dbManager;
private readonly IEnumerable<Lazy<IDbManager, IDbManagerMetadata>> DbManagers;
[ImportingConstructor]
public Repository([ImportMany(typeof(IDbManager))]IEnumerable<Lazy<IDbManager, IDbManagerMetadata>> dbManagers)
{
this.DbManagers = dbManagers;
var _dbManager = DbManagers.First(x => x.Metadata.DataProvider == DataProvider.Oracle).Value;
}
public void Execute()
{
var oracleDbManager = DbManagers.First(x => x.Metadata.DataProvider == DataProvider.Oracle).Value;
oracleDbManager.Initialize();
var sqlDbManager = DbManagers.First(x => x.Metadata.DataProvider == DataProvider.Sql).Value;
sqlDbManager.Initialize();
}
}