abp架构详解_大数定律通俗理解

abp架构详解_大数定律通俗理解网上有不少文章说ABP的模块,有的直接翻译自官网介绍,有的分析Modlue的源代码,有的写一通代码,没什么注释,很少有能通俗说清的。那么,有两个问题:1.ABP中的模块到底是什么?2.搞这个东西是干嘛

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

  网上有不少文章说ABP的模块,有的直接翻译自官网介绍,有的分析Modlue的源代码,有的写一通代码,没什么注释,很少有能通俗说清的。那么,有两个问题:1.ABP中的模块到底是什么?2.搞这个东西是干嘛用的?难道是吃撑了没事做?下面我们来如何通俗回答这两个问题。

  第一个问题:ABP中的模块到底是什么?

  通俗的理解,这个东西就相当于程序集,你开发的项目不是有很多个类库吗?或者会有很多个所谓的“项目型”的程序集吗?如下图所示:

abp架构详解_大数定律通俗理解

里面不是有一堆东西吗?例如:AbpCompanyName.AbpProjectName.Application,AbpCompanyName.ProjectName.TestModule等等一堆东西,这些东西就是模块,也就是程序集。这并没有什么好稀奇,也没什么好神秘的,就是Assembly而已,只不过在ABP中,我们要让这个程序集成为一个Module模块,需要在这个程序集里单独定义一个继承于AbpModule的类,例如在我的AbpCompanyName.ProjectName.TestModule里,我就定义一个继承于AbpModule的AbpProjectNameTestModule类,并在它的 Initialize()方法里鼓捣一句注册的方法: IocManager.RegisterAssemblyByConvention(typeof(AbpProjectNameTestModule).Assembly)即可

如下面代码所示:

abp架构详解_大数定律通俗理解
abp架构详解_大数定律通俗理解

 [DependsOn(typeof(AbpProjectName.AbpProjectNameApplicationModule))]
    public class AbpProjectNameTestModule:AbpModule
    {


        private string _initStr = string.Empty;

        public string InitStr { get { return _initStr; } set { _initStr = value; }}

        public override void Initialize()
        {
            IocManager.RegisterAssemblyByConvention(typeof(AbpProjectNameTestModule).Assembly);
            //base.Initialize();
        }


        public AbpProjectNameTestModule()
        {
            //Init
            _initStr = "AbpProjectNameTestModule() constructor init";
            Console.WriteLine(_initStr);
        }




    }

View Code

请忽略其他几个次要的代码,只关注Initialize方法即可。

第二个问题:搞这个东西是干嘛用的?

  既然这玩意就是程序集,那么还要费尽心思搞这个模块干嘛?岂不多此一举吗?难道让我吃饱了没事做吗?当然你可以不用,但用了有什么好处呢?如果我的项目有多个程序集,其中有一个依赖于其他几个程序集,如果这个项目一成不变倒没什么问题。但是如果有变,要替换其中依赖的一个或者几个程序集呢?那么问题就来了,凡是这个项目中有引用到的这些依赖程序集,都要一一替换,所以这个时候,就该使用ABP的模块了,它用来解决模块(或者叫程序集)的依赖问题

  ABP中使用模块依赖来解决这个问题,如果一个模块需要依赖于其他的模块,我们只需要在这个模块的上面写上属性DependsOn(XXXX模块)即可.例如我这里有一个叫做AbpProjectNameWebModule的模块,它依赖于AbpProjectNameApplicationModule,AbpProjectNameEntityFrameworkCoreModule,AbpAspNetCoreModule和AbpProjectNameTestModule,我们只需要在AbpProjectNameWebModule的头部加上这句即可:

[DependsOn(
typeof(AbpProjectNameApplicationModule),
typeof(AbpProjectNameEntityFrameworkCoreModule),
typeof(AbpAspNetCoreModule),
typeof(AbpProjectNameTestModule)
)]

代码如下所示:

abp架构详解_大数定律通俗理解
abp架构详解_大数定律通俗理解

 [DependsOn(
        typeof(AbpProjectNameApplicationModule), 
        typeof(AbpProjectNameEntityFrameworkCoreModule), 
        typeof(AbpAspNetCoreModule),
        typeof(AbpProjectNameTestModule)
        )]
    public class AbpProjectNameWebModule : AbpModule
    {
        private readonly IConfigurationRoot _appConfiguration;

        //构造函数注入 construc inject
        private AbpProjectNameApplicationModule _appModule;

        private AbpProjectNameTestModule _testModule;

        //Property inject
        //public AbpProjectNameApplicationModule _appModule { get; set; }



        public AbpProjectNameWebModule(IWebHostEnvironment env)
        {
            _appConfiguration = AppConfigurations.Get(env.ContentRootPath, env.EnvironmentName);
            //_appModule.A();
        }

        public AbpProjectNameWebModule(AbpProjectNameApplicationModule appModule,AbpProjectNameTestModule testModule)
        {
            //构造函数注入
            _appModule = appModule;

            _testModule = testModule;
        }



        public override void PreInitialize()
        {
            Configuration.DefaultNameOrConnectionString = _appConfiguration.GetConnectionString(AbpProjectNameConsts.ConnectionStringName);

            Configuration.Navigation.Providers.Add<AbpProjectNameNavigationProvider>();

            Configuration.Modules.AbpAspNetCore()
                .CreateControllersForAppServices(
                    typeof(AbpProjectNameApplicationModule).GetAssembly()
                );

            //test1
            _appModule.A();

            //test2
            //string str = _appModule.Bar();

            //test3
            //Baz baz = new Baz();
        }

        public override void Initialize()
        {
            IocManager.RegisterAssemblyByConvention(typeof(AbpProjectNameWebModule).GetAssembly());
        }

        public override void PostInitialize()
        {
            IocManager.Resolve<ApplicationPartManager>()
                .AddApplicationPartsIfNotAddedBefore(typeof(AbpProjectNameWebModule).Assembly);
        }
    }

View Code

其他东西先不要看,我们只看一句:

public AbpProjectNameWebModule(AbpProjectNameApplicationModule appModule,AbpProjectNameTestModule testModule)
{
//构造函数注入
_appModule = appModule;

_testModule = testModule;
}

在AbpProjectNameWebModule构造函数中,我们居然可以不用手动实例化AbpProjectNameApplicationModule和AbpProjectNameTestModule,就可以直接获取到它们的实例了,是不是很神奇?当然是ABP框架在背后帮我们做了模块注入的事,具体可以看看AbpBootstrapper,AbpModuleManager,AbpModule等类的代码,重点关注模块管理类AbpModuleManager的RegisterModules方法,这个方法就是用来注入所有的模块,代码如下所示:

        /// <summary>
        /// 将所有模块注册到IOC容器
        /// </summary>
        /// <param name="moduleTypes"></param>
        private void RegisterModules(ICollection<Type> moduleTypes)
        {
            foreach (var moduleType in moduleTypes)
            {
                _iocManager.RegisterIfNot(moduleType);
            }
        }

至于模块是怎么加载的,怎样注册注入的,又是怎样初始化和运行的,需要仔细分析上面几个类的源代码,下篇再总结,上面涉及的代码也会以一个demo的形式发布出来。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/170753.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 几种tree命令的简单安装方法

    几种tree命令的简单安装方法Linux基础tree命令的安装tree命令以树状图列出文件目录结构。不过某些Linux上(Centos6)没有tree命令,本文将介绍安装方法。一、利用镜像安装安装tree命令步骤1.查看系统版本:cat/etc/issue//查看发行版本2.将对应镜像放入光驱,3.挂载镜像文件mount/dev/cd

  • CSDN社区_毒APP公告

    CSDN社区_毒APP公告用户为本,让用户成为CSDN产品的主人,为此,我们特开设了CSDN产品公告栏,切实听取大家对新功能的反馈,定期抽取部分反馈用户赠送精美礼品一份!在过去一周,CSDN研发团队又上线了哪些功能呢?让我一起看下:CSDNAPP发布最新版,新增大厂在线刷题功能CSDN博主排名更新,原创优质博文更容易得到曝光MD编辑器优化操作更便捷更加极客酷炫的博客皮肤3.0上线绑定脉脉即可获得专属勋…

  • 山东大学舆情研究中心_舆情系统

    山东大学舆情研究中心_舆情系统项目结题总结一、项目背景二、技术要点三、功能介绍1、服务器端(1)启动服务器一、项目背景对于一所高校来说一个好的风评有着十分重要的作用,拥有一个良好的口碑,能吸引更多的生源、引进更多的人才,学校的综合素质能力也会因此提升,因此我们小组选择了《山东大学舆情分析系统》这一题目,通过搜集百度新闻、央视新闻、今日头条、齐鲁网、新浪、网易新闻、微博、知乎等网站的有关信息,对搜集到的文本信息所进行的分词、统计处理,将结果绘制成可视化的热度词条、情感倾向变化图,并实时展示在网站上,以此来更直观的了解山大的实时风评。

  • Jlink或者stlink用于SWD接口下载程序

    Jlink或者stlink用于SWD接口下载程序最近要使用stm32f103c8t6最小系统板,直接ISP串口下载程序太麻烦,就想着使用swd接口来调试。结果:通过SWD接口下载程序成功,但调试失败,还不知原因,会的的人麻烦交流一下。SWD接口:3.3VDIO(数据)CLK(时钟)GND1.首先声明jlink和stlink都有jtag和swd调试功能。jlink接口如下:如图,我使用的就是VCC…

  • lasso回归matlab,机器学习Lasso回归重要论文和Matlab代码「建议收藏」

    lasso回归matlab,机器学习Lasso回归重要论文和Matlab代码「建议收藏」这是机器学习Lasso回归重要论文和Matlab代码下载,最近要做《优化理论基础》的课程大作业,需要用到mnist这个手写识别数据库,在网上查了一下如何使用,分享在这里,以飨读者。软件介绍机器学习Lasso回归重要论文和Matlab代码是纽约大学(NYU)YannLecun在上个世纪90年代做的一个关于手写数字识别的数据库。该数据库提出的Motivation是为了解决美国邮政zipcode机器…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号