.NET Core之 ABP从入门到精通

ABP是一套基于WEB的快速开发引用框架,和DDD领域驱动开发有很好的结合。
主要特性:模块化,多租户,认证授权,虚拟文件系统,主题系统,后台作业,事件总线,对象映射,依赖注入,数据过滤等。
接下来用代码的方式介绍ABP框架的使用。

一.VS创建一个ABP控制台程序打出Hello word!

1.首先引入框架包
.NET Core之 ABP从入门到精通_第1张图片

Nuget中安装volo.abp.core
2.创建模块
所谓的ABP模块在代码中体现就是类,我们创建一个HelloABPModule的类,然后引入using Volo.Abp.Modularity;

using Volo.Abp.Modularity;

namespace HelloABP
{
    public class HelloABPModule:AbpModule
    {

    }
}

这样就创建好了一个最简单的ABP模块。模块一般不写业务逻辑。

3.我们创建一个服务
创建一个HelloWorldService用于书写业务逻辑。

using Volo.Abp.DependencyInjection;

namespace HelloABP
{
   public class HelloWorldService:ITransientDependency
    {
        public void Run() 
        {
            Console.WriteLine("Hello world!");
        }
    }
}

ABP可以按照约定去实现自己的依赖注入,也可以通过接口的形式去实现注入。我们引入using Volo.Abp.DependencyInjection;然后继承ITransientDependency这样我们就用注入了周期为瞬时的HelloWorldService进入了我们IOC容器。

手动注入服务
上面是自动注入服务的方式,接着看下手动注入的方式,手动注入服务的方式和我们直接在Statup中注入是一样的。


using Volo.Abp.Modularity;
//添加注入服务
using Microsoft.Extensions.DependencyInjection;

namespace HelloABP
{
    public class HelloABPModule:AbpModule
    {
        public override void ConfigureServices(ServiceConfigurationContext context)
        {
            context.Services.AddTransient<HelloWorldService>();
        }
    }
}

我们在HelloABPModule启动模块类进行注入就行,注入方式和原生注入一样。

4.使用
在MAIN方法中创建启动模块。

using System;
using Volo.Abp;
using Microsoft.Extensions.DependencyInjection;
namespace HelloABP
{
    class Program
    {
        static void Main(string[] args)
        {
            //创建启动模块,一般一个项目只有一个启动模块,
            var application = AbpApplicationFactory.Create<HelloABPModule>();
            //初始化
            application.Initialize();
            //调用服务
            var service = application.ServiceProvider.GetService<HelloWorldService>();
            service.Run();

        }
    }
}

这样一个最简单的ABP应用就跑起来了。

二.创建一个ASP.Net Core应用。

1.安装依赖包

abp.aspnetcore.mvc该包已经包含了第一部分的基础包,如果做WEB开发,安装这一个包就够了。

在这里插入图片描述
![在这里插入图片描述](https://img-blog.csdnimg.cn/97546ce9f411454187db272c9e204f8a.jpeg
2.创建应用启动模块
配置启动中间件管道,因为用了ABP进行项目启动,就不需要再用Statup类进行中间件配置了。
我们创建一个ABP模块类APPModule代码如下:

using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.Hosting;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.AspNetCore.Mvc;
using Volo.Abp.Modularity;




namespace WebApplication1
{
    //DependsOn注解可以定义在类和方法上,意思是我这个组件要依赖于另一个组件,也就是说被依赖的组件会比该组件先注册到IOC容器中。
    [DependsOn(typeof(AbpAspNetCoreMvcModule))]
    public class APPModule:AbpModule
    {
        public override void OnApplicationInitialization(ApplicationInitializationContext context)
        {
           // 直接从根容器获取     
           //等同于Statup类Configure方法中的参数一
            var app = context.GetApplicationBuilder();
             //等同于Statup类Configure方法中的参数二
            var env = context.GetEnvironment();

            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Error");
             
                app.UseHsts();
            }

            app.UseHttpsRedirection();
            app.UseStaticFiles();

            app.UseRouting();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapRazorPages();
            });
        }

    }
}

上面大部分代码都是Statup类中配置中间件的代码,我们把StatupConfigure方法中的中间件全部写到了ABP启动模块中,原来的Configure只需要写启动模块的初始化代码就行了。

3.注入ABP启动模块和初始化
打开Statup类,代码如下:

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.HttpsPolicy;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace WebApplication1
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddRazorPages();
            //注入ABP模块
            services.AddApplication<APPModule>();
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            //初始化模块
            app.InitializeApplication();
        }
    }
}

这2句注释的代码,和标题一中的控制台程序Mian方法的代码是一个意思,先注入服务,再初始化。这样我们就配置好了web应用的APB配置。接下来的业务操作,和控制台都是一样的了。

4.在ABP中使用控制器
创建一个控制器,代码如下:

using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Volo.Abp.AspNetCore.Mvc;

namespace WebApplication1.Controllers
{
   //需要继承ABP的控制器
    public class HellloController:AbpController
    {
        public IActionResult Index() 
        {
            return Content("Hello world");
        }
    }
}

并且需要把APPModule终结点的配置换成默认的,代码如下:

            //app.UseEndpoints(endpoints =>
            //{
            //    endpoints.MapRazorPages();
            //});
            //配置为默认
           app.UseConfiguredEndpoints();

这样我们就可以用ABP访问控制器了。
.NET Core之 ABP从入门到精通_第2张图片

三.模块的生命周期。

ABP模块生命周期就三步:配置,初始化,销毁。
配置分为配置前,和配置后。
我们点进去AbpModule可以看到PrePost这类方法,只要带Pre的就是操作之前的,Post为该方法操作之后的。
服务配置前

  public virtual void PreConfigureServices(ServiceConfigurationContext context);

配置之后

  public virtual void PostConfigureServices(ServiceConfigurationContext context);

初始化

 public virtual void OnApplicationInitialization(ApplicationInitializationContext context);

程序结束做的事情

 public virtual void OnApplicationShutdown(ApplicationShutdownContext context);

上面都是虚方法,自己有需要的业务可以重写。

四.ABP模块中的预配置选项。

预配置作用,就是在你做配置之前使用的。
首先创建一个MyModulePreOptions类,

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HelloABP
{
   public class MyModulePreOptions
    {
        public bool IsEnable { get; set; }
        public string Name { get; set; }

    }
}

然后我们在ABP模块中进行选项预配置,直接上代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp.Modularity;
//添加注入服务
using Microsoft.Extensions.DependencyInjection;

namespace HelloABP
{
    public class HelloABPModule:AbpModule
    {
        public override void PreConfigureServices(ServiceConfigurationContext context)
        {
            PreConfigure<MyModulePreOptions>(options=>options.IsEnable=true);
        }

        public override void ConfigureServices(ServiceConfigurationContext context)
        {
            //获取预配置后的信息
            var preOptions = context.Services.ExecutePreConfiguredActions<MyModulePreOptions>();
            if (preOptions.IsEnable) 
            {
                Configure<MyModulePreOptions>(options =>options.Name="Hello Abp");
            }

           // context.Services.AddTransient();
        }
    }
}

接着调用一下。

using Microsoft.Extensions.Options;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;

namespace HelloABP
{
  
  
   public class HelloWorldService:ITransientDependency
    {
        private readonly IOptions<MyModulePreOptions> _options;
        public HelloWorldService(IOptions<MyModulePreOptions> options)
        {
            _options = options;
        }

        public void Run() 
        {
            Console.WriteLine(_options.Value.Name??"选项未配置");
        }
    }
}

结果:
在这里插入图片描述
我们可以在预配置环节,对你需要配置的类进行属性初始化,然后我们在启动配置那块,调用你预配置好的类,然后做一些业务处理。

你可能感兴趣的:(.net,core,.netcore)