设为首页 加入收藏
当前位置:主页 > 香港六和开奖现场报码 > 正文阅读

Core MVC的插件式开发(三) - 如何在运行时启用组件

发表日期:2019-08-04 01:08  作者:admin  浏览:

  原标题:从零开始实现ASP.NET Core MVC的插件式开发(三) - 如何在运行时启用组件

  标题:从零开始实现ASP.NET Core MVC的插件式开发(三) - 如何在运行时启用组件

  标题:从零开始实现ASP.NET Core MVC的插件式开发(三) - 如何在运行时启用组件

  在前面两篇中,我为大家演示了如何使用Application Part动态加载控制器和视图,以及如何创建插件模板来简化操作。在上一篇写完之后,我突然想到了一个问题,如果像前两篇所设计那个来构建一个插件式系统,会有一个很严重的问题,即

  当你添加一个插件之后,整个程序不能立刻启用该插件,只有当重启整个Core应用之后,才能正确的加载插件。因为所有插件的加载都是在程序启动时ConfigureService方法中配置的。

  当你添加一个插件之后,整个程序不能立刻启用该插件,只有当重启整个ASP.NET Core应用之后,才能正确的加载插件。因为所有插件的加载都是在程序启动时ConfigureService方法中配置的。

  这种方式的插件系统会很难用,我们期望的效果是在运行时动态启用和禁用插件,那么有没有什么解决方案呢?答案是肯定的。下面呢,我将一步一步说明一下自己的思路、编码中遇到的问题,以及这些问题的解决方案。

  为了完成这个功能,我走了许多弯路,当前这个方案可能不是最好的,但是确实是一个可行的方案,如果大家有更好的方案,我们可以一起讨论一下。

  为了完成这个功能,我走了许多弯路,当前这个方案可能不是最好的,但是确实是一个可行的方案,如果大家有更好的方案,我们可以一起讨论一下。

  当遇到这个问题的时候,我的第一思路就是将ApplicationPartManager加载插件库的代码移动到某个Action中。于是我就在主站点中创建了一个PluginsController, 并在启用添加了一个名为Enable的Action方法。

  修改代码之后,运行程序,这里我们首先调用/Plugins/Enable来尝试激活组件,激活之后,我们再次调用/Plugin1/HelloWorld

  这里的原因是,只有当Core应用启动时,才会去ApplicationPart管理器中加载控制器与视图的程序集,所以虽然新的控制器程序集在运行时被添加到了ApplicationPart管理器中,但是ASP.NET Core不会自动进行更新操作,所以这里我们需要寻找一种方式能够让ASP.NET Core重新加载控制器的方法。

  修改代码之后重新运行程序,这里我们依然首先调用/Plugins/Enable,然后再次调用/Plugin1/Helloworld, 这时候你会发现Action被触发了,只是没有找到对应的Views。

  通过以上的方式,我们终于获得了在运行时加载插件控制器程序集的能力,但是插件的预编译Razor视图程序集没有被正确加载,这就说明IActionDeorChangeProvider只会触发控制器的重新加载,不会触发预编译Razor视图的重新加载。Core只会在整个应用启动时,才会加载插件的预编译Razor程序集,所以我们并没有获得在运行时重新加载预编译Razor视图的能力。

  针对这一点,我也查阅了好多资料,最终也没有一个可行的解决方案,也许使用ASP.NET Core 3.0的Razor Runtime Compilation可以实现,但是在ASP.NET Core 2.2版本,我们还没有获得这种能力。

  为了越过这个难点,最终我还是选择了放弃预编译Razor视图,改用原始的Razor视图。

  这里我们可以把每个插件组织成ASP.NET Core MVC中一个Area, Area的名称即插件的名称, 这样我们就可以将为Razor视图引擎的添加一个检索视图的规则,代码如下

  这里Modules是我重新创建的一个目录,后续所有的插件都会放置在这个目录中。

  这里Modules是我重新创建的一个目录,后续所有的插件都会放置在这个目录中。

  因为我们已经不需要使用Razor的预编译视图,所以Enable方法我们的最终代码如下

  最后我们需要在Plugin1Controller上添加Area配置, 并将编译之后的程序集以及Views目录放置到主站点项目的Modules目录中

  现在我们重新启动项目,重新按照之前的顺序,先激活插件,再访问新的插件路由/Modules/DemoPlugin1/plugin1/helloworld, 页面正常显示了。

  本篇中,我为大家演示了如何在运行时启用一个插件,这里我们借助IActionDeorChangeProvider, 让Core在运行时重新加载了控制器,虽然不支持预编译Razor视图的加载,但是我们通过配置原始Razor视图加载的目录规则,同样实现了动态读取视图的功能。

  下一篇我将继续将这个项目重构,编写业务模型,并尝试编写插件的安装以及升降级版本的代码。

  [2] 从零开始实现ASP.NET Core MVC的插件式开发(二) - 如何创建项目模板: 返回搜狐,查看更多香港挂牌生肖彩图

Power by DedeCms