Lind.DDD.Plugins~插件模式的集成

简介:

对于Lind.DDD这个敏捷框架来说,插件也是其中的一个亮点,所有被认为是插件(Plugins)的模块都会继承自IPlugins这个标示接口,它在程序启动时会找到所有插件,并通过autofac注册到运行时中,然后在使用时通过PluginManager对象进行获取,即所有模块只注册一次,在使用时只是从容器中取出实例的过程,这也保证的程序的性能!

Lind.DDD.Plugins设计图

一个接口,多个实现,根据具体业务,生产不同的实例,生产的过程前制到程序启动时,后期的使用直接从容器中获取,由于是key/value结构,所有获取的时间复杂度为O(1)

PluginModel模型

将需要动态生产,并且后期可能发生改变的插件持久化到数据库,文件,Nosql中,程序使用时,直接从存储介质里读取即可

    /// <summary>
    /// 插件模型
    /// Author:Lind
    /// 可以被持久化到数据库里,方便松插拨
    /// 根据数据库的值,生产对应的实例
    /// </summary>
    public class PluginModel : Entity
    {
        /// <summary>
        /// 模块名称:对插件进行分类管理
        /// </summary>
        public string ModuleName { get; set; }
        /// <summary>
        /// 类型显示名称,模块下面的类型列表,一个模块可以有多种类型
        /// </summary>
        public string TypeName { get; set; }
        /// <summary>
        /// 类型完整路径,命令名称+类名
        /// </summary>
        public string TypeFullName { get; set; }
    }

PluginManager插件管理者

没有Init(),Install()这种初始化的方法,而直接集成到了Config属性上,当没有初始化时,直接进行注册注册插件,当已经被初始化后,直接返回容器即可,这在程序部署时,变得更加自动化!

    /// <summary>
    /// 可插拔组件的管理者
    /// Author:Lind
    /// 依赖于Autofac
    /// </summary>
    public class PluginManager
    {
        /// <summary>
        /// 插件容器辅助字段
        /// </summary>
        private static IContainer _container = null;
        /// <summary>
        /// 互斥锁
        /// </summary>
        private static object lockObj = new object();
        /// <summary>
        /// 类的构造方法
        /// </summary>
        static PluginManager()
        {

            lock (lockObj)
            {
                if (_container == null)
                {
                    lock (lockObj)
                    {
                        try
                        {
                            Console.WriteLine("开始注册(IPlugins)所有插件...");
                            var builder = new ContainerBuilder();

                            foreach (var item in AssemblyHelper.GetTypesByInterfaces(typeof(IPlugins)))
                            {
                                builder.RegisterType(item)
                                      .Named(item.FullName, item.GetInterfaces().FirstOrDefault());
                            }
                            _container = builder.Build();
                        }
                        catch (Exception)
                        {
                            throw new ArgumentException("PluginManager依赖于autofac包包...");
                        }

                    }
                }
            }

        }
        /// <summary>
        /// 从插件容器里返回对象
        /// </summary>
        /// <param name="serviceName"></param>
        /// <param name="serviceType"></param>
        /// <returns></returns>
        public static object Resolve(string serviceName, Type serviceType)
        {
            return _container.ResolveNamed(serviceName, serviceType);
        }
        /// <summary>
        /// 从插件容器里返回对象
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="serviceName"></param>
        /// <returns></returns>
        public static TService Resolve<TService>(string serviceName)
        {
            return _container.ResolveNamed<TService>(serviceName);
        }

    }

通过这个Lind.DDD.Plugins的设计,让我们再次领略了IoC容器的魅力,当然它的基于还是接口,多态和面向对象的基本性质,所以,学好基础才是重中之重!

感谢各位的阅读,非常各位多多关注仓储大叔框架

本文转自博客园张占岭(仓储大叔)的博客,原文链接:Lind.DDD.Plugins~插件模式的集成,如需转载请自行联系原博主。

目录
相关文章
|
27天前
|
JavaScript 前端开发 持续交付
Prettier 高级应用:集成 CI/CD 流水线与插件开发
【10月更文挑战第18天】Prettier 是一款流行的代码格式化工具,它能够自动将代码格式化成一致的风格,从而提高代码的可读性和维护性。对于希望进一步发挥 Prettier 潜力的高级用户而言,将 Prettier 集成到持续集成(CI)和持续部署(CD)流程中,确保每次提交的代码都符合团队标准,是非常重要的。此外,通过开发自定义插件来支持更多语言或扩展 Prettier 的功能也是值得探索的方向。本文将详细介绍这两方面的内容。
40 2
|
2月前
|
监控 关系型数据库 MySQL
zabbix agent集成percona监控MySQL的插件实战案例
这篇文章是关于如何使用Percona监控插件集成Zabbix agent来监控MySQL的实战案例。
55 2
zabbix agent集成percona监控MySQL的插件实战案例
|
3月前
|
IDE API 开发工具
通过IDE插件体验阿里云OpenAPI的高效集成, 精品礼品等你来拿!
轻量级的开放API工具——Alibaba Cloud Developer Toolkit及Alibaba Cloud API Toolkit。这些插件支持快速查阅阿里云产品的开放API,提供API调试与SDK示例生成等功能,帮助开发者轻松集成阿里云服务。您可通过JetBrains Marketplace或VS Code Marketplace搜索安装,完成身份验证后即刻体验。欢迎分享您的使用反馈,有机会获得精美礼品!
|
4月前
|
监控 关系型数据库 分布式数据库
PolarDB开源项目成熟,强调插件开发与第三方工具集成,打造丰富生态。
【7月更文挑战第3天】PolarDB开源项目成熟,强调插件开发与第三方工具集成,打造丰富生态。插件开发涉及需求分析、接口设计、编码、测试和文档撰写。示例展示了性能监控插件的Go代码实现。此外,与DMS的数据迁移工具及Prometheus+Grafana监控系统的集成示例,展示了其易用性。PolarDB通过开放接口鼓励开发者参与生态建设,共同推动数据库技术进步。
70 1
|
4月前
|
开发者 Windows
三类代码协同模式问题之判断项目的协同规模决定采用集成分支问题如何解决
三类代码协同模式问题之判断项目的协同规模决定采用集成分支问题如何解决
|
4月前
Vite 项目中如何去集成 Mock 环境 (插件:vite-plugin-mock)
Vite 项目中如何去集成 Mock 环境 (插件:vite-plugin-mock)
178 0
|
6月前
|
传感器 前端开发 Android开发
【Flutter 前端技术开发专栏】Flutter 中的插件开发与集成
【4月更文挑战第30天】本文探讨了Flutter插件开发的关键技术和实践,包括插件作为连接Flutter与原生功能桥梁的角色,开发流程(定义接口、实现原生代码、打包发布),以及集成方法(添加依赖、初始化)。文中提到了多媒体、传感器和文件系统等常见插件类型,并以相机插件为例说明开发步骤。此外,还强调了版本兼容性、性能优化和错误处理的注意事项,推荐了开发工具和资源。随着Flutter的发展,插件开发将更加重要,未来有望形成更丰富的生态系统。
83 0
【Flutter 前端技术开发专栏】Flutter 中的插件开发与集成
|
6月前
|
监控 关系型数据库 分布式数据库
【PolarDB开源】PolarDB开源生态构建:插件开发与第三方工具集成
【5月更文挑战第23天】PolarDB开源项目成熟,生态成为开发者关注点。其插件机制和接口设计允许添加自定义功能,无需修改核心代码,促进扩展建设。本文涵盖插件开发流程和第三方工具集成实践,如性能监控插件示例和数据迁移工具、监控系统集成。PolarDB通过开放生态与标准化接口,激发开发者潜力,共同推动数据库技术创新。
102 0
|
6月前
|
JSON Kubernetes Go
无缝集成:在IntelliJ IDEA中利用Kubernetes插件轻松管理容器化应用
无缝集成:在IntelliJ IDEA中利用Kubernetes插件轻松管理容器化应用
277 0
无缝集成:在IntelliJ IDEA中利用Kubernetes插件轻松管理容器化应用
|
6月前
|
NoSQL Java Redis
SpringBoot集成Redis并使用Redis发布订阅模式
SpringBoot集成Redis并使用Redis发布订阅模式
275 3