zoukankan      html  css  js  c++  java
  • ABP框架

    文档目录

    本节内容:

    简介

     ABP为创建模块及组织它们提供基础框架。一个模块可依赖于另一个模块。通常地,一个程序集做为一个模块。如果你的应用是多个程序集,建议为每个程序集定义一个模块。

    模块系统目前把焦点放在服务端上而不是客户端。

    模块定义

    一个模块定义成一个继承于AppModule类的类。 假设我们正在开发一个能用于不同应用的Blog模块,最简单的模块定义可能像如下所示:

    public class MyBlogApplicationModule : AbpModule
    {
        public override void Initialize()
        {
             IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());
        }
    }

    模块定义类负责把自己的类注册到依赖注入里(约定做法如上所示)、配置应用和其它模块、为应用添加新的特性等...

    生命周期方法

    ABP在应用启动和关闭时,为模块调用一些特定的方法。你可以重写这些方法来执行一些特定的任务。

    ABP按依赖关系顺序调用这些方法。如果模块A依赖于模块B,模块B会在模块A前初始化,确切的启动方法顺序是:预初始化B,预初始化A,初始化B,提交B和提交A。这就是依赖路线。Shutdown方法类似,不过顺序是相反的。

    PreInitialize(预初始化)

    应用启动时最先调用这个方法,它通常在初始化前configure(配置)框架或是其它模块。

    同样,你也可以在这里写一些特定的代码运行在依赖注入注册之前。例如,你想创建一个约定注册(Conventional Registration)类,你应该在这里使用IcoManager.AddConventionalRegisterer方法来注册这个类。

    Initialize(初始化)

    依赖注入注册一般都在这里完成,一般都使用IcoManager.RegisterAssemblyByConvention方法。如果你想自定义依赖注册,请查看dependency injection documentation.

    PostInitialize(提交初始化)

    在启动过程中最后调用这个方法,此时可以安全的解析依赖。

    Shutdown(关闭)

    当应用关闭时调用这个方法。

    模块依赖

    一个模块可以依赖于其它模块,它要求使用DenpendsOn特性显式地声明依赖关系,如下:

    [DependsOn(typeof(MyBlogCoreModule))]
    public class MyBlogApplicationModule : AbpModule
    {
        public override void Initialize()
        {
            IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());
        }
    }

    由于我们声明MyBlogApplicationModule依赖于MyBlogCoreModule,所以MyBlogCoreModule会在MyBlogApplicationModule前初始化。

    ABP可以从startup模块解析依赖并按顺序初始化它们。

    插件模块

    尽管ABP解析是从startup模块开始到所有依赖,但也可以动态加载模块。AbpBootstrapper类定义PlugInSpurces属性,该属性用来就是用来添加源到动态加载插件模块,一个插件源可以是任何实现了IPlugInSource接口的类,PlugInFolderSource类实现了这个接口,并指明在某个文件夹下的程序集里获取一个插件模块。

    Asp.net Core

    译注:暂略

    Asp.net Mvc,Web Api

    在经典的Asp.net Mvc应用里,我们可以重写global.asax里的Application_Start来添加文件夹插件,如下所示:

    public class MvcApplication : AbpWebApplication<MyStartupModule>
    {
        protected override void Application_Start(object sender, EventArgs e)
        {
            AbpBootstrapper.PlugInSources.AddFolder(@"C:MyPlugIns");
            //...
            base.Application_Start(sender, e);
        }
    }

    插件中的控制器

    如果你的模块包含MVC或Web Api控制器,Asp.net不会检查你的控制器,为解决这个问题,你可以修改global.asax文件,如下:

    using System.Web;
    using Abp.PlugIns;
    using Abp.Web;
    using MyDemoApp.Web;
    
    [assembly: PreApplicationStartMethod(typeof(PreStarter), "Start")]
    
    namespace MyDemoApp.Web
    {
        public class MvcApplication : AbpWebApplication<MyStartupModule>
        {
        }
    
        public static class PreStarter
        {
            public static void Start()
            {
                //...
                MvcApplication.AbpBootstrapper.PlugInSources.AddFolder(@"C:MyPlugIns");
                MvcApplication.AbpBootstrapper.PlugInSources.AddToBuildManager();
            }
        }
    }

    附加程序集

    IAssemblyFinder和ITypeFinder(ABP用来检查指定类)的默认实现仅仅在自身程序集中查找模块和类型。我们可以在我们的模块重写GetAdditionalAssemblies方法来附加程序集。

    自定义模块方法

    你的模块同样可以自定义方法,其它依赖于该模块的模块,就可以使用这些方法。假设MyModule2依赖于MyModule1,想在预初始化时调用MyModule1里的一个方法。

    public class MyModule1 : AbpModule
    {
        public override void Initialize()
        {
            IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());
        }
    
        public void MyModuleMethod1()
        {
            //this is a custom method of this module
        }
    }
    
    [DependsOn(typeof(MyModule1))]
    public class MyModule2 : AbpModule
    {
        private readonly MyModule1 _myModule1;
    
        public MyModule2(MyModule1 myModule1)
        {
            _myModule1 = myModule1;
        }
    
        public override void PreInitialize()
        {
            _myModule1.MyModuleMethod1(); //Call MyModule1's method
        }
    
        public override void Initialize()
        {
            IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());
        }
    }

    此处,用构造器注入MyModule1给MyModule2,所以MyModule2可以调用MyModule1的自定义方法,这仅在Module2依赖于Module1的情况下可用。

    模块配置

    尽管自定义模块方法能配置模块,但我们建议使用启动配置(startup configuration)系统为模块定义和设置配置。

    模块生命期

    模块类自动地被注册成单例。

  • 相关阅读:
    为什么你需要升级 pip
    将py文件封装为exe
    Kafka原理分析之基础篇
    顶象验证码破解与研究
    优秀学员学习总结分享(三)
    优秀学员学习总结分享(二)
    ES6数组的扩展--Array.from()和Array.of()
    ES6核心特性
    优秀学员学习总结分享(一)
    JavaScript常见的六种继承方式
  • 原文地址:https://www.cnblogs.com/kid1412/p/5973274.html
Copyright © 2011-2022 走看看