Lind.DDD.DynamicModules动态模块化的设计

简介:

在Lind.DDD框架里有Module,主要用于全局自动添加的模块,它类似于ABP系统里的Module,但有时过于自动化了可能使系统太死板,而有时将需要的模块手动载入可能对我们更合适,所以大叔又设计了DynamicModules,它在系统初始化时将需要的模块进行注册,然后统一使用它即可。

完美的模块注册

 //添加默认模块和全局模块
            var config = DynamicModule.Create()
                                      .RegisterGlobalModule()
                                      .UseLogger()
                                      .UseMessaging()
                                      .UseCache();
            //添加自定义模块
            config.RegisterGenericModule(typeof(IExtensionRepository<>), typeof(EFRepository<>));

模块的使用

 //使用模块
var logger = LindContainer.Container.Resolve<ILogger>();
var message = LindContainer.Container.Resolve<IMessageManager>();
var repository = LindContainer.Container.Resolve<IExtensionRepository<UserInfo>>();
var cache = LindContainer.Container.Resolve<ICache>();

在一个WEB程序里,我们经过来模块注册的代码放在global里,在程序启动时一次性加载即可,在模块使用时,可以在需要的地方直接调用它,而在程序的设计上,主要有容器,动态模块管理和动态模块扩展组成,下面分别看一下实现的逻辑!

动态容器

使用autofac实现,主要用来存储对象的生命周期,一个对象的注册,生产和销毁都在这里实现

    /// <summary>
    /// Lind框架对象容器
    /// </summary>
    public class LindContainer
    {
        /// <summary>
        /// 容器的生产者
        /// </summary>
        public static ContainerBuilder Instance
        {
            get
            {
                if (instance == null)
                {
                    lock (lockObj)
                    {
                        if (instance == null)
                            instance = new ContainerBuilder();
                    }
                }
                return instance;
            }
        }
        /// <summary>
        ///容器的消费者
        /// </summary>
        public static IContainer Container
        {
            get
            {
                if (container == null)
                {
                    lock (lockObj)
                    {
                        if (container == null)
                            container = instance.Build();
                    }
                }
                return container;
            }
        }
        static IContainer container;
        static ContainerBuilder instance;
        static object lockObj = new object();

    }

动态模块管理者

主要提供了注册,生产等功能,这里我们可以扩展出一个泛型对象和普通对象的注册逻辑,在容器设计上我们使用了单例来存储,避免过多的开销

    /// <summary>
    /// 设计一个模块化注册机制
    /// </summary>
    public class DynamicModule
    {

        public static DynamicModule Instance { get; private set; }
        private DynamicModule() { }
        static ContainerBuilder builder;
        public static DynamicModule Create()
        {
            Instance = new DynamicModule();
            return Instance;
        }

        /// <summary>
        /// 注册全局组件
        /// </summary>
        /// <returns></returns>
        public DynamicModule RegisterGlobalModule()
        {
            this.RegisterModule<ILogger, NormalLogger>();
            return this;
        }
        /// <summary>
        /// 注册泛型类型
        /// </summary>
        /// <typeparam name="TService">接口</typeparam>
        /// <typeparam name="TImplement">实现</typeparam>
        /// <returns></returns>
        public DynamicModule RegisterGenericModule(Type service, Type implement)
        {
            LindContainer.Instance.RegisterGeneric(implement).As(service);
            return this;
        }
        /// <summary>
        /// 注册普通类型
        /// </summary>
        /// <typeparam name="TService"></typeparam>
        /// <typeparam name="TImplement"></typeparam>
        /// <returns></returns>
        public DynamicModule RegisterModule<TService, TImplement>()
            where TService : class
            where TImplement : TService
        {
            LindContainer.Instance.RegisterType(typeof(TImplement)).As(typeof(TService));
            return this;
        }

    }

模块的扩展程序

主要提供了Lind.DDD里的一些模块的注册入口,方便大家以后的注册过程,实质上就是.net里的扩展方法,这个在.net平台得到了广泛的应用!

    /// <summary>
    /// 模块化扩展
    /// </summary>
    public static class DynamicModuleExtensions
    {
        /// <summary>
        /// logger
        /// </summary>
        /// <param name="configuration"></param>
        /// <returns></returns>
        public static DynamicModule UseLogger(this DynamicModule configuration)
        {
            configuration.RegisterModule<ILogger, NormalLogger>();
            return configuration;
        }

        /// <summary>
        /// message
        /// </summary>
        /// <param name="configuration"></param>
        /// <returns></returns>
        public static DynamicModule UseMessaging(this DynamicModule configuration)
        {
            configuration.RegisterModule<IMessageManager, EmptyMessageManager>();
            return configuration;
        }

        /// <summary>
        /// cache
        /// </summary>
        /// <param name="configuration"></param>
        /// <returns></returns>
        public static DynamicModule UseCache(this DynamicModule configuration)
        {
            configuration.RegisterModule<Lind.DDD.Caching.ICache, Lind.DDD.Caching.RedisCache>();
            return configuration;
        }
    }

对于一种技术的研究,思考决定了你对这种技术理解的深度!

感谢汤雪华大师的ECommon,从中也得到了不少启发,还有微信的.net core架构理解也很新颖!

感谢各位的阅读!

本文转自博客园张占岭(仓储大叔)的博客,原文链接:Lind.DDD.DynamicModules动态模块化的设计,如需转载请自行联系原博主。

目录
相关文章
|
3月前
|
数据处理 开发者
深入解析Angular服务:构建可重用业务逻辑的最佳实践与模式——从基础创建到高级异步处理的全面指南
【8月更文挑战第31天】在Angular开发中,服务用于封装可重用的业务逻辑,有助于保持代码的DRY原则。本文详细介绍如何创建和使用服务,包括基础设置、逻辑封装及高级应用,如HTTP请求和异步数据处理,帮助你构建模块化、易维护的应用。通过示例展示,你将学会如何充分利用服务提升开发效率。
38 0
|
4月前
|
前端开发 开发者
领域驱动概念问题之在领域驱动设计中,components目录的作用是什么
领域驱动概念问题之在领域驱动设计中,components目录的作用是什么
|
5月前
|
JavaScript 前端开发
模块化(Modularization)是一种软件工程实践,旨在将大型、复杂的系统分割成一系列松散耦合、功能独立且具有明确定义接口的模块。
模块化简化复杂软件,通过划分独立模块提升代码可读性、维护性、复用性和扩展性。JavaScript模块化有多种方式:CommonJS(Node.js,`require()`/`module.exports`),AMD(RequireJS,异步加载,`define()`/`require()`),以及ES6 Modules(官方标准,`import`/`export`)。早期还有闭包和IIFE等非正式方法。现代工具如Webpack和Rollup处理兼容性问题,使模块化代码能在各种环境中运行。
64 0
|
6月前
|
前端开发 开发者
【专栏】BEM(Block-Element-Modifier)是一种前端命名规范和架构方法,旨在创建清晰、可维护的代码结构。
【4月更文挑战第29天】BEM(Block-Element-Modifier)是一种前端命名规范和架构方法,旨在创建清晰、可维护的代码结构。它包括Block(独立功能单元)、Element(Block的子元素)和Modifier(表示状态或变体)。BEM的特点包括命名一致性、模块化设计、清晰结构和可复用性,适用于代码组织、样式管理、组件化开发和团队协作。虽然命名较长和学习成本是其局限性,但BEM在提升代码质量和效率方面具有显著优势,是前端开发的重要工具。
124 0
|
前端开发
前端学习案例2-es6的模块化
前端学习案例2-es6的模块化
54 0
前端学习案例2-es6的模块化
|
前端开发
前端学习案例1-es6的模块化
前端学习案例1-es6的模块化
82 0
前端学习案例1-es6的模块化
node笔记记录33ES模块化规范1
node笔记记录33ES模块化规范1
74 0
node笔记记录33ES模块化规范1
node笔记记录34ES模块化规范2
node笔记记录34ES模块化规范2
56 0
node笔记记录34ES模块化规范2
|
前端开发 JavaScript NoSQL
DDD实战之二:看看代码结构长啥样
DDD实战之二:看看代码结构长啥样
DDD实战之二:看看代码结构长啥样