Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Prism/MEF-何时下载要加载的模块列表_C#_.net_Prism_Mef - Fatal编程技术网

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

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() {

我正在将一个项目转换为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为空!!为什么?


我知道我做错了什么,但这是我从头开始的第一个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检索后需要加载模块列表