不会发生MEF特性注射

时间:2012-02-01 11:16:25

标签: c# dependency-injection mef property-injection

从导入的属性中检索信息时出现问题。调用.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 {...}

非常感谢任何指针。非常感谢。

1 个答案:

答案 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);