zoukankan      html  css  js  c++  java
  • 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)声明了依赖关系
    在这里插入图片描述

  • 相关阅读:
    ZOJ 3765 Lights (zju March I)伸展树Splay
    UVA 11922 伸展树Splay 第一题
    UVALive 4794 Sharing Chocolate DP
    ZOJ 3757 Alice and Bod 模拟
    UVALive 3983 捡垃圾的机器人 DP
    UVA 10891 SUM游戏 DP
    poj 1328 Radar Installatio【贪心】
    poj 3264 Balanced Lineup【RMQ-ST查询区间最大最小值之差 +模板应用】
    【转】RMQ-ST算法详解
    poj 3083 Children of the Candy Corn 【条件约束dfs搜索 + bfs搜索】【复习搜索题目一定要看这道题目】
  • 原文地址:https://www.cnblogs.com/AlexanderZhao/p/12878827.html
Copyright © 2011-2022 走看看