2012-02-01 43 views
0

从导入的属性中检索信息时遇到问题。在调用.ComposeParts()后,该属性保持为空,但组成正常,因为之后我可以调用.GetExportedValues(),并获取所需的实例。下面是代码:MEF属性注入不会发生

引导程序做组合物

[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 {...} 

任何指针中的一个类的签名被理解的那样,非常感谢。

回答

2

您从不会调用任何代码来编写Bootstrapper类。 ComposeParts将创建该目录,除非您专门请求它们,否则它不会创建或撰写任何类。

当您调用GetExportedValues时,容器不会搜索需要导入的所有成员。它要么返回一个已经存在的实例,要么创建一个新实例,并满足其所有的导入属性。

换句话说,下面的代码会返回一个完全构造Bootstraper类:

 var b= Container.GetExportedValue<Bootstrapper>(); 
     Debug.Assert(b.Apps!=null);    

为了组成一个已经存在的对象,你需要调用SatisfyImportsOnce方法。如果可能的话,这将找到所有进口并满足它们。例如。

 Container.SatisfyImportsOnce(this); 
     Debug.Assert(this.Apps != null);