首页 > 其他分享 >1.模块化

1.模块化

时间:2023-01-29 00:45:31浏览次数:38  
标签:服务 模块化 TService 获取 模块 where public

本文 基于 abp,Bing,Osharp 模块部分

1.解耦

思考框架思路,最开始应该是解耦。

以前我们写项目直接引用第三方框架,导致如果后续项目升级,以及编写代码会产生大量问题,解耦是核心问题 。

解耦不是为了性能,而是优雅的代码。

 

2.代码实现

/// <summary>
    /// 模块
    /// </summary>
    public interface IModule
    {
        /// <summary>
        /// 模块级别。级别越小越先启动
        /// </summary>
        ModuleLevel Level { get; }
        /// <summary>
        /// 模块启动顺序。模块启动的顺序先按级别启动,同一级别内部再按此顺序启动,
        /// 级别默认为0,表示无依赖,需要在同级别有依赖顺序的时候,再重写为>0的顺序值
        /// </summary>
        int Order { get; }
        /// <summary>
        /// 添加依赖模块
        /// </summary>
        /// <param name="dependModuleBuilder"></param>
        void AddDependModule(IDependModuleBuilder dependModuleBuilder);
        /// <summary>
        /// 添加服务
        /// </summary>
        /// <param name="serviceContainer"></param>
        void AddService(IServiceContainer serviceContainer);
        /// <summary>
        /// 启动服务
        /// </summary>
        /// <param name="serviceContext"></param>
        void UseService(IServiceContext serviceContext);

    }

解释  

ModuleLevel  对应框架的等级 ,
Order      对应同等级的框架排序
这里会进行ModuleLevel排序,然后进行Order排序,最后依据排序的结果加载框架

   /// <summary>
    /// 依赖模块构建对象
    /// </summary>
    public interface IDependModuleBuilder
    {
        /// <summary>
        /// 添加指定模块
        /// </summary>
        /// <typeparam name="TModule">要添加的模块类型</typeparam>
        IDependModuleBuilder AddDependModule<TModule>() where TModule : IModule;
    }

  

IDependModuleBuilder 添加依赖模块抽象接口,判定框架依赖项正确加载
 /// <summary>
    /// 服务注册容器
    /// </summary>
    public interface IServiceContainer
    {
        /// <summary>
        /// 注册服务
        /// </summary>
        public IServiceCollection ServiceCollection { get; }
        /// <summary>
        /// 选项管理器
        /// </summary>
        public IOptionsManager OptionsManager { get; }
        /// <summary>
        /// 框架加载启动项
        /// </summary>
        public IBuilderManager BuilderManager { get; }
    }

  

IServiceContainer  注册所有服务
    /// <summary>
    /// 服务提供上下文
    /// </summary>
    public interface IServiceContext
    {

        /// <summary>
        /// 获取请求服务
        /// </summary>
        /// <typeparam name="T">服务类型</typeparam>
        TService GetRequiredService<TService>() where TService : notnull;

        /// <summary>
        /// 获取请求服务
        /// </summary>
        /// <param name="serviceType"></param>
        /// <returns></returns>
        object GetRequiredService(Type serviceType);

        /// <summary>
        /// 获取请求服务
        /// </summary>
        /// <typeparam name="T">服务类型</typeparam>
        TService? GetService<TService>() where TService : notnull;

        /// <summary>
        /// 获取请求服务
        /// </summary>
        /// <param name="serviceType"></param>
        /// <returns></returns>
        object? GetService(Type serviceType);

        /// <summary>
        /// 获取请求服务
        /// </summary>
        /// <typeparam name="T">服务类型</typeparam>
        IEnumerable<TService> GetServices<TService>() where TService : notnull;

        /// <summary>
        /// 获取请求服务
        /// </summary>
        /// <param name="serviceType"></param>
        /// <returns></returns>
        IEnumerable<object?> GetServices(Type serviceType);
        /// <summary>
        /// 获取选项
        /// </summary>
        /// <typeparam name="TOptions"></typeparam>
        /// <param name="key"></param>
        /// <returns></returns>
        TOptions GetOptions<TOptions>(string? key = null) where TOptions : class;

        /// <summary>
        /// 服务提供上下文
        /// </summary>
        /// <returns></returns>
        IServiceContext GetServiceContext();

        /// <summary>
        /// 异步任务取消令牌提供程序
        /// </summary>
        /// <returns></returns>
        ICancellationTokenContext GetCancellationTokenContext();
    }

  服务获取提供容器,基于ABP ServiceProvider  本质是一个服务内存缓存,保证服务不会重复获取





标签:服务,模块化,TService,获取,模块,where,public
From: https://www.cnblogs.com/GoodDog/p/17071581.html

相关文章

  • SAP入门技术分享四:模块化程序
    模块化程序​​1.子程序概要​​​​2.子程序定义​​​​3.子程序参数​​​​(1)传递参数的方法​​​​(2)定义参数类型​​​​(3)参数与结构体​​​​(4)参数与内表​​​​4.......
  • Labview ,非标自动化软件通用程序框架,程序模块化新增,快速开发
    Labview,非标自动化软件通用程序框架,程序模块化新增,快速开发,只需配置表格,逻辑判断,循环跳转,变量新建,都在表格内实现,程序不需要改动,快速设备开发,自动化设备编写程序周期由2周......
  • 模块化
                      ......
  • 前端模块化概览
    amdrequire.js,依赖前置,预先下载,立即执行index.html<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=......
  • Html飞机大战(十八): 模块化+项目开源
    好家伙,好久好久没有更新这个系列了        为了使文档更方便阅读,使代码更容易维护,来把这个飞机大战模块化项目已开源:https://gitee.com/tang-an......
  • Jekyll 教程——模块化(includes)
    我们知道,软件工程里面有一个很重要的概念,叫「高内聚低耦合(Highcohesion&Lowcoupling)」。意思是说,程序结构中各模块的内聚程度越高,模块间的耦合程度就越低,一个好的内聚模......
  • 深入浅出es6模块化
      天下苦CommonJs久矣EsModule的独特之处在于,既可以通过浏览器原生加载,也可以与第三方加载器和构建工具一起加载。支持Esmodule模块的浏览器可以从顶级......
  • 31_Java中的模块化
    Java中的模块化一、模块化概述​ Java语言随着这些年的发展已经成为了一门影响深远的编程语言,无数平台,系统都采用Java语言编写。但是,伴随着发展,Java也越来......
  • 20、前端基础-ES6---模块化
    ......
  • VUE3 全局共享数据方案之一 VUEX企业级模块化设计(详细流程)
    Vue3,webpack,vite通用适用于中大型项目中1.安装vuexnpmivuex 2.创建仓库与文件结构(核心)一,创建入口在src目录下创建store文件夹,store文件夹下创建下面文件结......