欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

ASP.NET Core Zero模块系统讲解

程序员文章站 2021-12-12 11:38:00
简介在abp中, 模板的定义就是一个类, 只需要继承 abpmodule, 该类可以通过nuget包搜索abp安装。下面演示在应用程序或类库中, 定义一个模块: public class applic...

简介

在abp中, 模板的定义就是一个类, 只需要继承 abpmodule, 该类可以通过nuget包搜索 abp 安装。

下面演示在应用程序或类库中, 定义一个模块:

 public class applicationmodule : abpmodule
    {
        public override void initialize()
        {
            iocmanager.registerassemblybyconvention(typeof(applicationmodule).getassembly());
        }
    }

说明: 关于iocmanager.registerassemblybyconvention的作用, 则是将当前程序集模块注册到容器当中, 作为一个模块, 常见的是暴露模块对应的服务,
而其中所有的服务, 都是按照声明周期而声明, 例如: itransientdependency ,isingletondependency。

下面展示了iocmanager.registerassemblybyconvention 执行的部分细节:

public void registerassembly(iconventionalregistrationcontext context)
{
            //transient
            context.iocmanager.ioccontainer.register(
                classes.fromassembly(context.assembly)
                    .includenonpublictypes()
                    .basedon<itransientdependency>()
                    .if(type => !type.gettypeinfo().isgenerictypedefinition)
                    .withservice.self()
                    .withservice.defaultinterfaces()
                    .lifestyletransient()
                );

            //singleton
            context.iocmanager.ioccontainer.register(
                classes.fromassembly(context.assembly)
                    .includenonpublictypes()
                    .basedon<isingletondependency>()
                    .if(type => !type.gettypeinfo().isgenerictypedefinition)
                    .withservice.self()
                    .withservice.defaultinterfaces()
                    .lifestylesingleton()
                );

            //...
}

常见的方法

在abpmodule中, 定义了几组方法, 分别在应用程序模块加载的前后进行, 如下:

        public virtual void initialize();
        public virtual void postinitialize();
        public virtual void preinitialize();
        public virtual void shutdown();
  • initialize : 通常, 这里用于注册程序集依赖选项
  • postinitialize : 初始化最后调用
  • preinitialize : 初始化之前调用
  • shutdown : 当应用程序关闭时调用

模块依赖

通常来讲, 一个模块往往依赖与一个或者多个模块, 这里, 也涉及到了模块的加载生命周期。
假设: 模块a依赖于模块b, 那么意味着模块b会先于模块a初始化。

关于模块之间的依赖, 则可以通过特性的方式 dependson 为模块显示声明, 如下所示:

[dependson(typeof(bmodule))]
public class amodule : abpmodule
{
    public override void initialize()
    {
        //...
    }
}

模块加载

任何模块都依赖于启动模块进行加载, 这很常见, 例如机箱中的各个模块: 内存、硬盘、显卡、电源。 都需要通电的过程, 让他们进行整个启动过程。
abp 则依赖于 abpbootstrapper 来进行调用初始化, 可以通过 initialize 方法加载。

 public static class applicationbootstrapper
    {
        public static abpbootstrapper abpbootstrapper { get; private set; }

       public static void init(){
         //...
         abpbootstrapper.initialize();
       }
    }

同样, 模块也可以读取指定文件夹路径的方式进行加载模块, 如下所示:

services.addabp<mystartupmodule>(options =>
{
    options.pluginsources.add(new folderpluginsource(@"c:\myplugins"));
});

or

services.addabp<mystartupmodule>(options =>
{
    options.pluginsources.addfolder(@"c:\myplugins");
});

查看更多

到此这篇关于asp.net core zero模块系统的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持。