Prism / MEF - 何时下载要加载的模块列表

时间:2011-12-20 16:22:13

标签: c# .net prism mef

我正在将项目转换为Prism / MEF,需要从中央数据库下载模块列表

但是“list downloader”实例引用设置为null,因此假设代码不在正确的位置

这是流程

public class Bootstrapper : MefBootstrapper {
    [Import]
    IMyList  sync1 { get; set; }

    ...
    protected override void ConfigureAggregateCatalog() {
        **sync1.Sync();             // sync1 is null**

        AggregateCatalog.Catalogs.Add(....)
    }
    ...
}


[Export(typeof(IMyList))]
private class DBSync : IMyList {
     [Import] IDBConn mydb { get; set; }
     public void Sync(){ 
         // connects to mydb and gets a list of auth modules for the current user
     }
}

问题是sync1 iS NULL !!为什么?

我知道我做错了什么,但这是我从头开始的第一个棱镜项目,所以请轻松一下

2 个答案:

答案 0 :(得分:0)

据我所知,你还没有导出MyList。因此,我认为您需要在私有类DBCon

之前的行上放置一个导出属性

我希望这会有所帮助......

...奈杰尔

答案 1 :(得分:0)

您正在使用sync1配置目录。你有可能还没有编写零件吗?

对于要编译的Bootstrapper部件,它需要由MEF实例化,例如使用GetExportedValue<>,否则IMyList将为null。

如果是这样,您将需要更改代码,以便MEF已在其目录中包含IMyList的一部分,然后添加其他部分。

如果这不是您的问题,在满足其中一个DBSync导入时,另一个可能的问题来源可能是合成错误,即:

[Import] IDBConn mydb { get; set; }

在这种情况下,你应该得到一个例外。您可以尝试在调试中运行该程序,同时设置中断所有公共语言运行时异常的选项。

编辑:

如果容器为null,则无法在引导程序类中组成导入。 MEf在实例化类时导入它的组件。在创建容器之前,您不能依赖可用的导入。

你必须:

更改IMyList sync1,这样它就不再是导入了。

如果你真的需要由MEF组成你的IMyList,你需要创建一个临时容器(不需要使用MefBootStrapper)并使用这个临时容器来组成bootstrapper类中的部分。你可以事后处理它。请参阅其他答案(Satisfy Imports in custom ExportProvider)。

我真的建议选择第一个选项,更改sync1,因此它不是导入,除非你有令人信服的理由这样做。