在运行时更新MEF目录

时间:2012-02-17 20:08:08

标签: asp.net-mvc runtime mef composition

我目前正在使用MEF开发MVC网络应用程序,以便a)开发人员可以为网站开发插件,用户可以在他们的帐户中选择他们想要的插件。这意味着我的一些组合必须在应用程序启动并且用户已登录后进入(进入数据库,抓取插件的程序集并将它们添加到当前目录中)。

它的工作方式是我有几个库存储在数据库中,并在用户登录加载到AssemblyCatalog时拉出,我可以成功添加到现有AggregateCatalog在我的作曲家中。但是,在我的一个库中,我有一个IController合约未导出,导致该特定小部件中断。我不完全确定如何强制MEF在启动后重新组合。我在这里发帖,希望有人对我有一些建议。

我的代码基于excellent blog series by Matt Abbott,所以我有点希望他也会提出一些建议。

2 个答案:

答案 0 :(得分:2)

好吧,你不能只加载所有可用的部分(无论哪个客户端启用它们),但使用延迟实例化,通过LazyExportFactory结合元数据来识别零件到您的客户端系统?这样你就不需要按需加载程序集,它们就可以随时使用了。

如果您希望从数据库中动态读取程序集并将其加载到AppDomain中,则可以将其包装在新的AssemblyCatalog中,但可以利用重构。 / p>

例如,在那个早期版本中,我使用PartCreator<T,TMetadata>演变为ExportFactory<T,TMetadata>即将发布(但不包括在最终的.NET 4.0中)。如果您将[ImportMany]更改为[ImportMany(AllowRecomposition = true)],则下次添加新目录时,例如:

((AggregateCatalog)container.Catalog).Catalogs.Add(<assembly>);

哪个应该重新组合[ImportMany] PartCreatorExportFactory个实例。

不确定这是否有用......在我说它会起作用还是不行之前,我需要了解你想要的架构...

答案 1 :(得分:0)

我将这作为一个答案,即使它不是一个真正的答案,而是更多的结论。我的问题是:我在应用启动时正在做我的所有MEF组合,然后在用户登录后尝试将其全部分开。

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

我将采取这一时刻,再次感谢Matthew Abbott在MEF和MVC上的精彩系列,这真的有助于推动这一应用。 :)我没有将他的回答标记为回复,但我做了更多的投票,以帮助他获得更多声誉。