首先:你们都很棒,我经常在这个网站上搜索MEF答案。
我的问题如下:
我有几个装配有许多[Imports]的装配和一个装配发生的主要应用程序。现在的问题是,那些Imports没有被“填充”,它们总是保持为空。
我试图在一个简单的小项目中重现这种行为,并提出了以下源代码。
我想知道关于MEF的一些事情吗?
请帮忙!谢谢大家!
装配接口:
namespace Interfaces
{
public interface IClass1
{
void Trigger();
}
public interface IClass2
{
void Trigger();
}
public interface IClass3
{
void Trigger();
}
}
Assembly Library1:
namespace Library1
{
[Export(typeof(IClass1))]
public class Class1:IClass1
{
#region IClass1 Members
public void Trigger()
{
}
#endregion
}
}
Assembly Library2:
namespace Library2
{
[Export(typeof(IClass2))]
public class Class2:IClass2
{
[Import]
public IClass1 Class1 { get; set; }
public void Trigger()
{
}
}
}
在主程序中,我组装完整的Mef内容,执行以下操作:
namespace MEFTest
{
public class mefStart
{
public CompositionContainer Container { get; private set; }
public void Start()
{
AggregateCatalog catalog = new AggregateCatalog();
AssemblyCatalog assemblyCatalog = new AssemblyCatalog(typeof(Program).Assembly);
DirectoryCatalog directoryCatalog = new DirectoryCatalog(".", "Library*.dll");
catalog.Catalogs.Add(directoryCatalog);
catalog.Catalogs.Add(assemblyCatalog);
this.Container = new CompositionContainer(catalog);
CompositionBatch batch = new CompositionBatch();
batch.AddExportedValue(this.Container);
this.Container.Compose(batch);
this.Container.ComposeParts(this);
}
}
}
但是之后,下面的类没有填充任何导入:
namespace MEFTest
{
public class Class3:IClass3
{
[Import]
public IClass1 Class1 { get; set; }
[Import]
public IClass2 Class2 { get; set; }
public void Trigger()
{
Class1.Trigger();
Class2.Trigger();
}
}
}
当我查看容器时,我看到IClass1和ICLass2已经组成。
为什么Class3中的[Import]不满足?我想我完全错过了一些东西......
提前感谢大家的帮助!
迈克尔
答案 0 :(得分:3)
只要未通过MEF实例化class3,您就不会看到任何导入。
顺便说一句,如果你不是通过[ImportingConstructor]进行导入 - 请确保在使用之前导入满意的(IPartImportsSatisfiedNotification)。
这可行,但我不知道你需要你的class3
public class mefStart
{
[Import]
private IClass3 my3;
public CompositionContainer Container { get; private set; }
public void Start()
{
AggregateCatalog catalog = new AggregateCatalog();
AssemblyCatalog assemblyCatalog = new AssemblyCatalog(typeof(Program).Assembly);
DirectoryCatalog directoryCatalog = new DirectoryCatalog(".", "Library*.dll");
catalog.Catalogs.Add(directoryCatalog);
catalog.Catalogs.Add(assemblyCatalog);
this.Container = new CompositionContainer(catalog);
CompositionBatch batch = new CompositionBatch();
batch.AddExportedValue(this.Container);
this.Container.Compose(batch);
this.Container.ComposeParts(this);
//from here you can use Class3 with all imports
}
}
[Export(typeof(IClass3)]
public class Class3:IClass3
{
[Import]
public IClass1 Class1 { get; set; }
[Import]
public IClass2 Class2 { get; set; }
public void Trigger()
{
Class1.Trigger();
Class2.Trigger();
}
}