Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.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
Asp.net mvc 在运行时更新MEF目录_Asp.net Mvc_Runtime_Mef_Composition - Fatal编程技术网

Asp.net mvc 在运行时更新MEF目录

Asp.net mvc 在运行时更新MEF目录,asp.net-mvc,runtime,mef,composition,Asp.net Mvc,Runtime,Mef,Composition,我目前正在与MEF合作开发一个MVC web应用程序,以便a)开发者可以为网站开发插件,用户可以选择他们想要的插件。这意味着我的一些合成必须在应用程序已经启动并且用户已经登录(进入数据库,获取插件的程序集并将它们添加到当前目录)之后进行 它的工作方式是,我在数据库中存储了几个库,当用户登录并加载到AssemblyCatalog时,我会将它们取出,并成功地添加到我的Composer中现有的AggregateCatalog。然而,在我的一个库中,我有一个IController契约没有被导出,导致特定

我目前正在与MEF合作开发一个MVC web应用程序,以便a)开发者可以为网站开发插件,用户可以选择他们想要的插件。这意味着我的一些合成必须在应用程序已经启动并且用户已经登录(进入数据库,获取插件的程序集并将它们添加到当前目录)之后进行

它的工作方式是,我在数据库中存储了几个库,当用户登录并加载到
AssemblyCatalog
时,我会将它们取出,并成功地添加到我的Composer中现有的
AggregateCatalog
。然而,在我的一个库中,我有一个
IController
契约没有被导出,导致特定的小部件中断。我不完全确定如何在启动后强制MEF重新组合。我在这里发帖,希望有人能给我一些建议


我的代码基于,所以我希望他也会提出一些建议。

好吧,你不能加载所有可用的部分(不管哪个客户端启用了它们),但使用延迟实例化,通过
Lazy
ExportFactory
结合元数据来识别客户端系统的部件?这样,您就不需要按需加载程序集,它们已经准备就绪

如果您希望从数据库中动态读取程序集并将其加载到
AppDomain
,您可能可以将其包装到新的
AssemblyCatalog
,但可以利用重新编译

例如,在早期版本中,我使用的是
PartCreator
,它演变为
ExportFactory
,即将发布(但未包含在最终的.NET 4.0中)。如果将
[ImportMany]
更改为
[ImportMany(AllowRecomposition=true)]
,则下次添加新目录时,例如:

((AggregateCatalog)container.Catalog).Catalogs.Add(<assembly>);
((AggregateCatalog)container.Catalog).Catalogs.Add();
它应该重新组合
[ImportMany]
一组
PartCreator
ExportFactory
)实例


不确定这是否有效。。。我需要先了解您的预期体系结构,然后才能说它会或不会起作用……

我将此作为一个答案,尽管它不是一个真正的答案,但更多的是一个结论。我的问题是:我在应用程序启动时做了所有的MEF合成,然后试图在用户登录后按用户将其分离

事实上,我只需要推迟这一切。首先让用户登录,然后根据用户“安装”的内容(从数据库中提取程序集等)执行所有MEF组合,将该组合容器存储在会话或其他存储机制中(这样我就可以根据需要获得导出以构建页面、小部件等),我就成功了。我最初的问题是试图把一个方形的钉子装进一个圆孔里。我的作文不需要发生,直到登录,而不是启动。虽然我可能会使用MEF在我的应用程序中进行一些DI,但这与用户合成是分开的


不过,我将借此机会再次感谢Matthew Abbott关于MEF和MVC的精彩系列,这确实有助于推动该应用程序的发展。:)我没有把他的回答标记为回答,但我投了更高的票来帮助他赢得更多的声誉。

你好,马修!基本上,我使用的是您的代码版本,该版本在您的博客系列的第3部分中链接,没有重大更改。我可以加载所有插件/小部件,但按照我们为这个站点制定的计划,这可能意味着为所有客户端加载数百个程序集,这可能是不可能的。因此,我只能在运行时按需加载。我还没有尝试AllowRecomposition属性,所以我将对此进行一次尝试,看看会发生什么。:)谢谢你的回复!AllowRecomposition似乎适用于启动后加载的程序集,但其中一个程序集的IController导出似乎没有为ImportControllerFactory重新编译,因此对该控制器/操作的任何请求都会失败。我很乐意给你发一些代码让你看看,那会很酷吗?谢谢你修复链接,雷斯特。:)非常感谢。