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的形式发布出来。

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

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

(0)
上一篇 2022年8月17日 上午6:00
下一篇 2022年8月17日 上午6:16


相关推荐

  • 一张图认识Python(附基本语法总结)

    一张图认识Python(附基本语法总结)一张图带你了解 Python 更快入门 一张图认识 Python 附基本语法总结 Python 基础语法总结 1 Python 标识符在 Python 里 标识符有字母 数字 下划线组成 在 Python 中 所有标识符可以包括英文 数字以及下划线 但不能以数字开头 Python 中的标识符是区分大小写的 以下划线开头的标识符是有特殊意义的 以单下划线开头 foo

    2026年3月17日
    2
  • PS批量处理:转格式、压缩图片的方法

    PS批量处理:转格式、压缩图片的方法转自 http blog sina com cn s blog 5ffdb44d0100 html 之前在传漫画时发现偶收的漫画好多是超大的 BMP 格式的 几十页的小漫画居然都能占去 100MB 实在是超浪费硬盘空间 上传也慢 所以用 PS 把它们在不影响图片质量的情况下压小来 最简单的方法就是转成 JPG 格式 不过这页数如此之多 一张张存大概会死人吧 这时当然要用 PS 的动作和批处

    2026年3月18日
    1
  • 安卓java模拟器怎么用_安卓java模拟器(安卓手机如何玩JAVA游戏以及JAVA软件的方法)…

    安卓java模拟器怎么用_安卓java模拟器(安卓手机如何玩JAVA游戏以及JAVA软件的方法)…首先最简单的方法就是 JAVA 模拟器 但是由于 JAVA 模拟器的兼容性并不是太好而导致部分 挺大部分的 机型无法使用 所以就有了第二个方法 那就是 PSP 模拟器 因为 PSP 上是有 JAVA 模拟器的 所以就可以通过模拟 PSP 后模拟 JAVA 是不是有点像绕口令 虽然复杂但是确实是一个有效的解决方法 然后就进入教程吧 以下内容下载会放在最后 第一个方法 java 模拟器版 JAVA 模拟器首先你需要下载 JAVA 模

    2026年3月16日
    2
  • Windows Xp 优化文件 的一段BAT代码

    Windows Xp 优化文件 的一段BAT代码WindowsXp 优化文件的一段 BAT 代码 echoofftitle 优化文件 startclscolo COLS 50LINES 27echo nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp WindowsXp 优化文件 echo nbsp nbsp nbsp nbsp PoweredByThu e

    2026年3月26日
    1
  • thinkphp无法加载控制器:Admin

    thinkphp无法加载控制器:Admin

    2021年9月21日
    212
  • unity3d游戏场景制作[通俗易懂]

    unity3d游戏场景制作[通俗易懂]运用unity3d熟练,不仅可以更巧妙的熟练制作出游戏更重要的是可以做到将自己完美的想象发挥的淋漓尽致。   UniSky是Unity3d的一款模拟环境天气的插件,使用它可以简单的实现呼风唤雨的各种功能。   使用起来也非常的方便。   引入Package后(注意路径必须是英文否则会出错)Project中会多一个文件夹:

    2022年5月18日
    46

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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