从导入的属性中检索信息时出现问题。调用.ComposeParts()后,该属性保持为null,但组合正常,因为之后我可以调用.GetExportedValues()并获得所需的实例。这是代码:
执行合成的引导程序
[Export]
public class Bootstrapper
{
public void Run()
{
doComposition();
}
private void doComposition()
{
var catalog = new AggregateCatalog();
catalog.Catalogs.Add(new DirectoryCatalog("./Applications"));
catalog.Catalogs.Add(new AssemblyCatalog(typeof(Loader).Assembly));
Container = new CompositionContainer(catalog);
// Apps = Container.GetExportedValues<IApplication>(); - this gets me the IApplication(s), but I dont understand why Apps isn't injected automatically
Container.ComposeParts(catalog);
IEnumerable<IApplication> app = Container.GetExportedValues<IApplication>();
}
public CompositionContainer Container { get; set; }
private IEnumerable<IApplication> apps;
[ImportMany(typeof(IApplication))]
public IEnumerable<IApplication> Apps
{
get { return apps; }
set
{
apps = value;
}
}
实施IApplication的其中一个类的签名
[Export(typeof(IApplication))]
public class MDFApplication : IApplication {...}
非常感谢任何指针。非常感谢。
答案 0 :(得分:2)
您永远不会调用任何代码来编写Bootstrapper类。 ComposeParts将创建目录,在您明确要求之前,它不会创建或组合任何类。
当您调用GetExportedValues时,容器不会搜索需要导入的所有成员。它要么返回一个已经存在的实例,要么创建一个新的实例,满足其所有的导入属性。
换句话说,以下代码将返回一个完全构造的Bootstraper类:
var b= Container.GetExportedValue<Bootstrapper>();
Debug.Assert(b.Apps!=null);
为了编写已存在的对象,您需要调用SatisfyImportsOnce方法。如果可能,这将找到所有导入并满足它们。 E.g。
Container.SatisfyImportsOnce(this);
Debug.Assert(this.Apps != null);