public class ClassMerger
{
[Import(typeof(ITest))]
public ITest pTest { get; set; }
[Import(typeof(INewTest))]
public INewTest ObjImportClass { get; set; }
private AggregateCatalog catalog { get; set; }
public static CompositionContainer container { get; set; }
public void Compose()
{
DirectoryCatalog dc = new DirectoryCatalog(@" Debug");
catalog = new AggregateCatalog(dc);
AssemblyCatalog catalog1 = new AssemblyCatalog(Assembly.GetExecutingAssembly());
catalog.Catalogs.Add(catalog1);
container = new CompositionContainer(catalog);
container.ComposeParts(catalog);
}
}
В приведенном выше коде, когда я говорю container.composeparts (каталог), все мои интерфейсы (например, ITest) имеют значение null. Но когда я переписываю его как container.ComposeParts (это) детали составлены. Если да, то как я упоминаю мой контейнер для компоновки частей для всех классов, присутствующих в моей сборке.
Вы получаете нуль, потому что он никогда не попытается составить для вашего класса ClassMerger, а скорее для AssemblyCatalog, разрабатывая:
Когда вы говорите container.Composeparts (каталог); вы сообщаете MEF о создании деталей для украшенных свойств внутри вашего экземпляра AssemblyCatalog.
С другой стороны, когда вы указываете container.ComposeParts (это); вы сообщаете MEF о создании этих украшенных свойств в экземпляре класса ClassMerger, тем самым, наконец, обнаружив, что ваши свойства заполняются.
Обратите внимание, что контейнер = новый CompositionContainer (каталог); вы говорите MEF, где искать детали, которые могут удовлетворить ваши более поздние, загруженные, украшенные свойства при стрельбе. ComposeParts...