Предположим, у меня есть интерфейс ITest
:ServiceLocator GetAllInstances не содержит экземпляр которого контракт имя указано
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, независимо от того, какая реализация имеет экспортированное имя контакта?