我正在将项目转换为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 !!为什么?
我知道我做错了什么,但这是我从头开始的第一个棱镜项目,所以请轻松一下
答案 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,因此它不是导入,除非你有令人信服的理由这样做。