ABP模块系统学习及使用

55 篇文章 2 订阅
26 篇文章 0 订阅

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)声明了依赖关系
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值