Предположим, у меня есть интерфейс ITest
:
public interface ITest
{
void PrintMachineInfo();
}
И плюс две реализации:
[Export("MachineName", typeof(ITest))]
[PartCreationPolicy(CreationPolicy.Shared)]
public class Test1 : ITest
{
public void PrintMachineInfo()
{
Console.WriteLine(Environment.MachineName);
}
}
[Export(typeof(ITest))]
[PartCreationPolicy(CreationPolicy.Shared)]
public class Test2 : ITest
{
public void PrintMachineInfo()
{
Console.WriteLine(Environment.OSVersion);
}
}
Затем я попытался получить все экземпляры ITest
:
var foo = ServiceLocator.Current.GetAllInstances<ITest>();
foreach (var test in foo)
{
test.PrintMachineInfo();
}
Получается, что можно вернуть только экземпляр Test2
. Из-за имени контракта он просто не может найти экземпляр Test1
.
Я использую MEF + ServiceLocator + MefAdapter, чтобы все это работало. Судя по моей отладке, MefAdapter перезаписывает метод DoGetAllInstances(Type serviceType)
в ServiceLocatorImplBase
, но предоставляет только один параметр serviceType
.
Итак, как получить все экземпляры ITest
с помощью ServiceLocator, независимо от того, экспортировано ли в реализации имя контакта или нет?