• ABP模块系统学习及使用


    ABP模块系统简介

    参考:
    ABP中配置的注册和初始化
    ABP模块系统
    ABP 源码解析 一. ABP启动

    ABP框架提供了创建和组装模块的基础,一个模块能够依赖于另一个模块。在通常情况下,一个程序集就可以看成是一个模块。在ABP框架中,一个模块通过一个类来定义,而这个类要继承自AbpModule。

    模块生命周期事件

    在一个应用中,abp框架调用了Module模块的一些指定的方法来进行启动和关闭模块的操作。我们可以重载这些方法来完成我们自己的任务。

    ABP框架通过依赖关系的顺序来调用这些方法,
    假如:模块A依赖于模块B,那么模块B要在模块A之前初始化,模块启动的方法顺序如下:

    1. PreInitialize-B
    2. PreInitialize-A
    3. Initialize-B
    4. Initialize-A
    5. PostInitialize-B
    6. PostInitialize-A

    模块预定义事件

    • PreInitialize:
      预初始化:当应用启动后,第一次会调用这个方法。在依赖注入注册之前,你可以在这个方法中指定自己的特别代码。举个例子吧:假如你创建了一个传统的登记类,那么你要先注册这个类(使用IocManager对登记类进行注册),你可以注册事件到IOC容器。等。

    • Initialize
      初始化:在这个方法中一般是来进行依赖注入的注册,一般我们通过IocManager.RegisterAssemblyByConvention这个方法来实现。如果你想实现自定义的依赖注入,那么请参考依赖注入的相关文档。

    • PostInitialize
      提交初始化:最后一个方法,这个方法用来解析依赖关系。

    • Shutdown:
      关闭:当应用关闭以后,这个方法被调用。

    示例:模块的运用

    我们先定义一个模块程序集,然后在控制台应用中使用该模块

    1. 创建一个.net framework类库项目:MyModule1
    2. 通过Nuget引入ABP包
    3. 定义模块: 添加一个类MyModule1,继承自AbpModule
    4. 重写Initialize方法,把当前程序集的特定类或接口注册到依赖注入容器中
    5. 添加一个示例类TestClass,实现ITransientDependency接口
    6. 添加一个.Net Framework 控制台应用程序,并添加MyModule1项目的引用
    7. 在Main方法中创建并初始化AbpBootstrapper类的实例
    8. 初始化AbpBootstrapper类的实例
    9. 通过Ioc容器获取MyModule1模块中TestClass类的实例
    10. 使用模块中的类定义的方法

    源码:

    1. MyModule1项目:
      TestClass.cs:
    using Abp.Dependency;
    
    namespace MyModule1
    {
        public class TestClass : ITransientDependency
        {
            public string SayHello()
            {
                return "Hello,World!";
            }
        }
    }
    

    MyModule1.cs:

    using Abp.Modules;
    using System.Reflection;
    
    namespace MyModule1
    {
        public class MyModule1 : AbpModule
        {
            /// <summary>
            /// 模块初始化
            /// </summary>
            public override void Initialize()
            {
                //这行代码的写法基本上是不变的。
                //它的作用是把当前程序集的特定类或接口注册到依赖注入容器中。
                IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());
            }
        }
    }
    
    1. ModuleTestConsole项目:
    using Abp;
    using Abp.Dependency;
    using MyModule1;
    using System;
    
    namespace ModuleTestConsole
    {
        class Program
        {
            static void Main(string[] args)
            {
                //创建AbpBootstrapper实例
                using (var bootstrapper = AbpBootstrapper.Create<MyModule1.MyModule1>())
                {
                    //初始化AbpBootstrapper实例
                    bootstrapper.Initialize();
    
                    //通过Ioc容器获取MyModule1模块中TestClass类的实例
                    using (var tester = bootstrapper.IocManager.ResolveAsDisposable<TestClass>())
                    {
                        //使用模块中的类定义的方法
                        var result = tester.Object.SayHello();
                        Console.WriteLine(result);
                    } //Disposes tester and all it's dependencies
    
                    Console.WriteLine("Press enter to exit...");
                    Console.ReadLine();
                }
            }
        }
    }
    

    模块依赖

    Abp框架会自动解析模块之间的依赖关系,但是我们还是建议你通过重载GetDependencies方法来明确的声明依赖关系。
    这个可以参考官方示例项目:AbpEfConsoleApp
    在这个项目里面,定义了一个MyConsoleAppModule模块,它依赖于AbpEntityFrameworkModule,这里通过特性(Attribute)声明了依赖关系
    在这里插入图片描述

  • 相关阅读:
    java架构师学习路线-HTTP请求类型及说明
    java架构师学习路线-关闭HTTP的TRACE方法
    AC自动机模板
    loj 2721 [NOI2018] 屠龙勇士
    scrum介绍
    本地搭建nacos集群
    js对象
    函数声明与表达式、匿名函数与具名函数、立即执行函数
    第六章 SSH远程服务介绍
    第十二章 配置vlan
  • 原文地址:https://www.cnblogs.com/AlexanderZhao/p/12878827.html
Copyright © 2020-2023  润新知