插件模式历史悠久,各种中大型软件基本上都会实现插件机制,以此支持功能扩展,从开发部署层面,插件机制也可实现功能解耦,对于并行开发、项目部署、功能定制等都有比较大的优势。

在.NET Core下,一般我们基于.NET Core扩展库进行开发,通常使用依赖注入、配置、设置(Options)等机制,如果将插件模式与依赖注入、配置、设置进行结合,将可以提供非常灵活的扩展机制。基于此,我们实现了一个开源的插件框架,本文将进行简单的介绍。

一、PluginFactory插件库

  • 项目地址:

  • Gitee:https://gitee.com/WuYeCai/pluginfactory

  • Github:https://github.com/xfrogcn/Xfrogcn.PluginFactory

  • Nuget包:

    Xfrogcn.PluginFactory 实现包,在主项目中引用

    Xfrogcn.PluginFactory.Abstractions 抽象包,在插件项目中引用,或者你可以

    全重新实现自己的插件机制

  • 主要功能:

  • 插件的自动载入

  • 通过插件的初始化接口可让插件控制主应用的依赖注入

  • 插件的启动及停止,此机制可与.NET Core的Hosting扩展结合,在宿主启动时自动启动插件

  • 抽象分离,你可以通过实现Xfrogcn.PluginFactory.Abstractions中的相关接口来完全实现自己的插件载入、启动等机制

  • 与.NET Core配置、设置、宿主等完美融合

  • 支持插件依赖程序集的多版本载入

二、主要概念

  • 插件载入器:对应IPluginLoader接口,负责从指定位置加载插件程序集

  • 插件工厂:对应IPluginFactory接口,负责插件的实例化及插件的启动和停止

  • 插件:对应IPlugin接口,所有插件需要实现此接口,实现插件的启动及停止机制

  • 可初始化插件:对应ISupportInitPlugin接口,通过此接口可以在依赖注入Provider构建之前向容器注入自定义的服务

  • 可配置插件:对应ISupportConfigPlugin接口,通过此接口可将插件配置与.NET Core的配置(Configuration)及设置(Options)机制集合

三、使用向导

示例项目可参考:Xfrogcn.PluginFactory.Example Gitee地址 Github地址

1)安装

在主程序项目中添加Xfrogcn.PluginFactory

在插件项目中添加Xfrogcn.PluginFactory.Abstractions

2)在主程序中启用

可通过以下两种方式来启用插件库,一是通过在Host层级的Use机制以及在依赖注入IServiceCollection层级的Add机制,以下分别说明:

1. 通过IHostBuilder的UsePluginFactory方法启用插件库

UsePluginFactory具有多个重载版本,详细请查看API文档
默认配置下,将使用程序运行目录下的Plugins目录作为插件程序集目录, 使用宿主配置文件作为插件配置文件(通常为appsettings.json)
你也可以通过使用带有 Assembly 或 IEnumerable 参数的版本直接传入插件所在的程序集

2. 通过IServiceCollection的AddPluginFactory方法启用插件库

AddPluginFactory具有多个重载版本,详细请查看API文档
默认配置下,将使用程序运行目录下的Plugins目录作为插件程序集目录

注意: AddPluginFactory方法不会使用默认的配置文件作为插件配置,你需要显式地传入IConfiguration, 如果是在 ASP.NET Core 环境中,你可以在Startup类中直接获取到

3)编写插件

插件是实现了IPlugin接口的类,在插件库中也提供了PluginBase基类,一般从此类继承即可。标准插件具有启动和停止方法,通过IPluginFactory进行控制。

要编写插件,一般遵循以下步骤:

创建插件项目(.NET Core 类库),如TestPluginA

添加Xfrogcn.PluginFactory.Abstractions

创建插件类,如Plugin,从PluginBase继承

启动或停止方法中可通过context中的ServiceProvider获取注入服务

通过PluginAttribute特性设置插件的元数据

插件元数据以及插件载入的插件列表信息可以通过IPluginLoader.PluginList获取

4)插件启动

IPluginFactory本身实现了.NET Core扩展库的IHostedService机制,故如果你是在宿主环境下使用,如(ASP.NET Core),插件的启动及停止将自动跟随宿主进行,如果未使用宿主,可通过获取IPluginFactory实例调用相应方法来完成.

5)编写支持初始化的插件

在很多场景,我们需要在插件中控制宿主的依赖注入,如注入新的服务等,这时候我们可通过实现支持初始化的插件(ISupportInitPlugin)来实现,该接口的Init方法将在依赖注入构建之前调用,通过方法参数IPluginInitContextServiceCollection可以控制宿主注入容器。

6)使用插件配置

插件支持 .NET Core 扩展库中的Options及Configuration机制,你只需要从SupportConfigPluginBase类继承实现插件即可,其中TOptions泛型为插件的配置类型。插件配置自动从宿主配置或启用插件工厂时传入的配置中获取,插件配置位于配置下的Plugins节点,该节点下以插件类名称或插件别名(通过PluginAttribute特性指定)作为键名,此键之下为插件的配置,如以下配置文件:

扩展PluginA实现配置:

定义配置类,如PluginOptions

实现插件

注意:在插件初始化方法中也可使用注入的配置

跨插件配置

有些配置可能需要在多个插件中共享,此时你可通过Plugins下的_Share节点进行配置,此节点下配置将会被合并到插件配置中,可通过PluginOptions进行访问。

7)插件化 ASP.NET Core

要让 ASP.NET Core 获取得到插件中的控制器,你只需要在插件的初始化方法Init中,向MVC注入插件程序集:

一个.NET Core下的开源插件框架Pluginfactory相关推荐

  1. Asp.Net Core下的开源任务调度平台ScheduleMaster

    从何说起 2017年初的时候,由于当时项目需要做了一个乞丐版定时调度系统,那时候只在单机上实现了核心的调度功能.做这个玩意之前也调研了社区中开源的解决方案,找了几个实地部署试跑了一下,其实都很不错.但 ...

  2. Asp.Net Core下的开源任务调度平台ScheduleMaster—快速上手

    概述 ScheduleMaster是一个开源的分布式任务调度系统,它基于Asp.Net Core平台构建,支持跨平台多节点部署运行. 它的项目主页在这里: https://github.com/hey ...

  3. .NET Core下的开源分布式任务调度系统ScheduleMaster-v2.0低调发布

    从1月份首次公开介绍这个项目到现在也快4个月了,期间做了一些修修补补整体没什么大的改动.2.0算是发布之后第一个大的版本更新,带来了许多新功能新特性,也修复了一些已知的bug,在此感谢在博客.Issu ...

  4. 我们一起完成插件框架的设计与实现

    我们一起完成插件框架的设计与实现 原文:我们一起完成插件框架的设计与实现 开场一些题外话,今天登陆这个"小菜"的博客园,感触颇多."小菜"是我以前在QQ群里面的 ...

  5. 9个开源自动化测试框架,质量保证测试工程师用起来

    自动化测试框架由一组最佳实践,通用工具和库组成,可帮助测试人员评估多个Web和移动应用的功能,安全性,可用性和可访问性.而在,软件开发世界中有很多的自动化测试框架,该如何选择? 虽然技术团队可以构建复 ...

  6. 这8款开源自动化测试框架,你还没用上?

    在如今开源的时代,我们就不要再闭门造车了,热烈的拥抱开源吧!本文针对性能测试.Web UI 测试.API 测试.数据库测试.接口测试.单元测试等方面,为大家整理了github或码云上优秀的自动化测试开 ...

  7. 优测云服务平台分享开源自动化测试框架,快快get起来

    自动化测试框架构建很复杂?时间会很长,可能会出现错误?那就来了解一些开源的框架吧,让自动化测试框架构建不再难!优测云服务平台分享开源自动化测试框架,快快get起来! 虽然技术团队可以构建复杂的自动化测 ...

  8. android插件框架机制的选择,Android插件开发初探——基础篇

    Android插件开发初探 对于Android的插件化其实已经讨论已久了,但是市面上还没有非常靠谱成熟的插件框架供我们使用.这里我们就尝试性的对比一下Java中,我们使用插件化该是一个怎么样的流程,且 ...

  9. python画界面的插件_ImagePy——UI界面支持开放插件的Python开源图像处理框架

    雷锋网 AI 科技评论按,ImagePy 是一款 python 开源图像处理框架,其 UI 界面支持开放插件.在 github:https://github.com/Image-Py/imagepy ...

最新文章

  1. (转)maven打包时跳过测试
  2. 人工智能再下一城,在多人扑克中大胜人类
  3. vue项目中使用echarts实现词云
  4. 汇编程序.c到a.out的生命历程
  5. 赖美云的认证照_真人秀及综艺类双榜单TOP10嘉宾热度认证 赖美云双面魅力引热议...
  6. 前端学习(1993)vue之电商管理系统电商系统之根据id删除数据
  7. 实现Table多类不同数据类型的排序(顺反)
  8. 前端跨域之Jsonp实现原理及.Net下Jsonp的实现
  9. 【概率统计】(在更)
  10. win10 java8安装包双击之后完全没反应
  11. 缅怀:腾讯游戏毛星云(浅墨)突然离世
  12. AlphaGo来了,终结者不远了
  13. 禁止迅雷极速版被强制升级为迅雷x
  14. 深圳水上乐园有哪些 而且便宜还好玩
  15. git rebase使用简介
  16. 小红书关键词搜索不到帖子?如何让小红书笔记被收录?
  17. 超全总线控制方式总结
  18. windows添加右键打开cmd命令窗口
  19. 项目整体管理:制定项目章程--启动过程组
  20. web开发技术和技术分享_2020年将改变Web开发的顶级技术

热门文章

  1. Ansible 详解2-Playbook使用
  2. P2680 运输计划
  3. emwin之错误使用控件函数导致死机现象
  4. Hbase笔记4 java操作Hbase
  5. 2014-11-25nbsp;11:26
  6. C语言控制流对应的汇编语句
  7. 如何批量删除指定的GitHub Repos
  8. Linux安装 微信开发者工具(deepin linux ubt)
  9. 阿里云MaxCompute香港开服 将引入更多人工智能服务
  10. Java基础知识回顾--线程