C# Prism/MEF-何时下载要加载的模块列表
我正在将一个项目转换为Prism/MEF,需要从中央数据库下载模块列表 但是,list downloader实例引用设置为null,因此假设代码不在正确的位置 这是流程C# Prism/MEF-何时下载要加载的模块列表,c#,.net,prism,mef,C#,.net,Prism,Mef,我正在将一个项目转换为Prism/MEF,需要从中央数据库下载模块列表 但是,list downloader实例引用设置为null,因此假设代码不在正确的位置 这是流程 public class Bootstrapper : MefBootstrapper { [Import] IMyList sync1 { get; set; } ... protected override void ConfigureAggregateCatalog() {
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为空!!为什么?
我知道我做错了什么,但这是我从头开始的第一个prism项目,所以请轻松一点据我所知,您尚未导出IMyList。因此,我认为您需要在私有类DBCon之前的行上放置一个导出属性 我希望这有助于
Nigel…您正在使用sync1配置目录。有没有可能你还没有组成你的角色 对于要编译的引导程序部件,它需要由MEF实例化,例如使用GetExportedValue,否则IMyList将为null 如果是这样,您将需要更改代码,以便MEF在其目录中已经有IMyList的一部分,然后添加其他部分 如果这不是您的问题,那么问题的另一个可能来源可能是在满足一个DBSync导入时的合成错误,即:
[Import] IDBConn mydb { get; set; }
在这种情况下,您应该得到一个异常。您可以尝试在调试中运行该程序,同时将选项设置为在所有公共语言运行时异常上中断
编辑:
如果您的容器为空,它将无法在引导程序类中组合导入。MEf在实例化类时导入其组件。在创建容器之前,不能依赖导入
你必须:
更改IMyList sync1,使其不再是导入
如果你真的需要让你的IMyList由MEF组成,你将需要创建一个临时容器,不需要使用MefBootStrapper,只需要使用这个临时容器来组成你的bootstrapper类中的部分。你可以事后处理。请看另一个答案
我真的建议您使用第一个选项,如果您没有令人信服的理由这样做,请将sync1更改为非导入选项。抱歉,更新了问题,这是在代码中完成的,但没有在quesproblem中显示。Bootstrapper.ConfigureModuleCatalog中的容器为null,其中使用Sync检索后需要加载模块列表