学习C#—ABP vNext框架:第一章(初识ABP vNext)

3,754 阅读2分钟

一、ABP vNext简介

ABP vNext框架是一个基于ASP.NET核心的完整基础设施,通过遵循软件开发最佳实践和最新技术来创建现代web应用程序和API,这样开发人员可以更加灵活的选择自己需要的功能进行集成,使项目设计更加合理,更加细粒度的模块化设计。

Abp vNext 官方文档提供了非常全面的功能介绍,官方提供了启动模板,模板遵循了领域驱动设计的最佳实践来进行项目分层,引入了常用的功能模块。

官网地址:ABP 框架 - 开源 Web 应用程序框架

二、初步学习ABP vNext练习

这里以控制台项目为例,我使用的是最新版的.net7创建的项目,在下面项目中展示的揭是最新版的Nuget包引入

1、创建项目

image.png

2、引入Nuget包(Volo.Abp.Core)

image.png

3、书写加载程序集方法

加载程序集需要引入NUget包(Microsoft.Extensions.Hosting)

下面是项目代码演示

internal class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Hello, World!");
        
        CreateHostBuild(args).RunConsoleAsync().Wait();
    }

    /// <summary>
    /// 加载程序集
    /// </summary>
    internal static IHostBuilder CreateHostBuild(string[] args) =>
        Host.CreateDefaultBuilder(args)
        .ConfigureAppConfiguration((context, config) =>
        {

        })
        .ConfigureServices((hostContxt, sevices) =>
        {
            //代码加载固定文件
            sevices.AddApplication<ConsoleAbpModule>(options =>
            {
                //加载文件夹下的所有模块
                options.PlugInSources.AddFolder("D:\\ABP_vNext\\Plugs");
            });

        })
        .UseAutofac();//.UseAutofac()这是ABP vNext的IOC容器模块

}

4、注册ConsoleAbpModule模块服务类

using Microsoft.Extensions.DependencyInjection;
using Volo.Abp;
using Volo.Abp.Autofac;
using Volo.Abp.Modularity;

namespace ABP_vNext_1_
{
    /// <summary>
    ///  [DependsOn(typeof(AbpAutofacModule))]
    ///  集成ABP的IOC模块
    /// </summary>
    [DependsOn(typeof(AbpAutofacModule))]
    //集成自定义模块   [DependsOn(typeof(CustomAbpModule.CustomModule))]
    [DependsOn(typeof(CustomAbpModule.CustomModule))]
    internal class ConsoleAbpModule : AbpModule
    {
        public override void ConfigureServices(ServiceConfigurationContext context)
        {
            Console.WriteLine("重写程序配置信息,将文件ConsoleAbpModule转化为ABP vNext项目文件");
            //使用代码固定注册项目文件

            //注册方式 、
            //1、代码指定注册 => context.Services.AddSingleton<IOCModule>();
            //2、接口注册 => IOCModule : ISingletonDependency
            //3、特性注册 => [Dependency(ServiceLifetime.Singleton)]
            //context.Services.AddSingleton<IOCModule>();
            context.Services.AddHostedService<ConsoleHostService>();
        }
    }
}

5、注册IOC容器类

using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.DependencyInjection;

namespace ABP_vNext_1_
{
    /// <summary>
    ///  [Dependency(ServiceLifetime.Singleton)]
    ///  注册IOC容器
    /// </summary>
    [Dependency(ServiceLifetime.Singleton)]
    internal class IOCModule /*: ISingletonDependency 接口注入*/
    {
        public void Show()
        {
            Console.WriteLine("这是我的IOCModule IOC容器");
        }
    }
}

6、注册ConsoleHostService实现类

using Microsoft.Extensions.Hosting;
using PlugsInterfaceModule;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ABP_vNext_1_
{
    internal class ConsoleHostService : IHostedService
    {
        //属性依赖注入
        public IOCModule IOCModule { get; set; }

        /// <summary>
        /// 项目启动时发生
        /// </summary>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        /// <exception cref="NotImplementedException"></exception>
        public Task StartAsync(CancellationToken cancellationToken)
        {
            Console.WriteLine("项目启动时发生");
            IOCModule.Show();
            return Task.CompletedTask;
        }

        /// <summary>
        /// 项目关闭时发生
        /// </summary>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        /// <exception cref="NotImplementedException"></exception>
        public Task StopAsync(CancellationToken cancellationToken)
        {
            return Task.CompletedTask;
        }
    }
}

7、集成自定义AbpModule模块

新建一个项目,创建一个自定义模块类,实现ABPModule image.png

在主项目中,引入项目,在主项目的服务中使用特性注入,如图

image.png

8、集成插件模块PlugModule

8.1 新创建一个项目,实现ABP模块化

image.png

8.2 打包发布

image.png

8.3 在打包发布的文件中找到这个项目的DLL文件

把这个dll文件放到你指定的程序集加载目录中 image.png

image.png

三、运行结果

image.png