ABP-VNEXT 学习笔记(一)基本使用

abp因为是模块化框架,所以需要使用哪个模块,再从nuget上引用即可。

ABP官网:https://abp.io/

一、控制台示例

 

首先创建一个控制台项目,基于net core 3.1 ,引入 Volo.Abp.Core 核心库,abp更新很快,要注意看版本兼容。

 

 

ABP有一个启动模块AbpModule,我们每个项目都必须要有一个启动模块,也仅需一个启动模块, 来继承AbpModule 。在启动模块中可以做一些注入

namespace HelloAbp
{
   public class HelloAbpModule:AbpModule
    {
    }
}

比如,例子中我创建了一个空的启动模块。

然后我们再创建一个服务类HelloWorldService,来处理我们的业务逻辑。例子中定义一个Run方法,输出hello world。

using System;
using Volo.Abp.DependencyInjection;

namespace HelloAbp
{
    public class HelloWorldService:IScopedDependency
    {
        public void Run()
        {
            Console.WriteLine("hello world");
        } 
    }
}

这里大家会看到HelloWorldService继承了IScopedDependency,这是ABP依赖注入的一种方式。提供了3种方式,分别对应我们依赖注入的3种方式

IScopedDependency:对应Scoped 生命周期

ITransientDependency:对应Transient生命周期,瞬时。

ISingletonDependency:对应Singleton生命周期,单例

 

只需要继承对应的接口,即可 以对应的生命周期方式自动注入。很方便。

 

我们启动模块也创建了,服务也有了,那怎么连起来调用呢?

看示例:

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

namespace HelloAbp
{
    class Program
    {
        static void Main(string[] args)
        {
            var application = AbpApplicationFactory.Create<HelloAbpModule>(); //加载启动模块
            application.Initialize(); //启动模块初始化

            var service = application.ServiceProvider.GetService<HelloWorldService>(); //利用启动模块,获取服务
            service.Run(); //执行服务定义的方法

        }
    }
}

首先,我们必须把启动模块初始化起来,然后利用启动模块,来加载服务。这样就可以调用服务里面的方法了。看执行情况:

 

 

输出了方法体中的内容。这样我们就实现了控制台中简单的使用方式。

以往,我们依赖注入大部分都是利用接口来注入的,那在这里,如果用接口,我们又如何使用呢?其实是一样的,我直接贴代码:

namespace HelloAbp
{
   public interface IHelloWorldService
    {
        void Run();

    }
}

定义一个接口服务类。

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

namespace HelloAbp
{
    public class HelloWorldService:IScopedDependency,IHelloWorldService
    {
        public void Run()
        {
            Console.WriteLine("hello world");
        } 
    }
}

继承接口。

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

namespace HelloAbp
{
    class Program
    {
        static void Main(string[] args)
        {
            var application = AbpApplicationFactory.Create<HelloAbpModule>(); //加载启动模块
            application.Initialize(); //启动模块初始化

            var service = application.ServiceProvider.GetService<IHelloWorldService>(); //利用启动模块,获取服务
            service.Run(); //执行服务定义的方法

        }
    }
}

 在获取服务时,采用接口类型。这样也是得到一样的结果。

当然对于我们开发来说,正常都是使用接口来处理,这也正是依赖注入的重要作用。

这样,一个完整的控制台依赖注入的示例就好了。

 

 

二、那在于我们的net core MVC项目中,又要如何处理呢

首先创建一个 netcore 3.1版本的MVC项目

 

 

nuget引用以上2个包,其中core是核心库。MVC项目必须引用MVC库。同样要注意版本兼容问题。

 一样的,MVC库也需要创建一个启动模块,来继承AbpModule。

using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.Hosting;
using Volo.Abp;
using Volo.Abp.AspNetCore.Mvc;
using Volo.Abp.Modularity;

namespace WebApplication1.Models
{
    [DependsOn(typeof(AbpAspNetCoreMvcModule))] //必须依赖
    public class AppModule:AbpModule
    {
        /// <summary>
        /// 在启动模块初始化中,我们就可以把startup中的配置都搬过来
        /// </summary>
        /// <param name="context"></param>
        public override void OnApplicationInitialization(ApplicationInitializationContext context)
        {
            var app = context.GetApplicationBuilder();
            var env = context.GetEnvironment();
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
            }


            app.UseRouting();


            app.UseConfiguredEndpoints(); //使用ABP的路由总结点
        }
    }
}

创建启动项之后,当然就是添加到配置服务里面了,以及初始化了,在startup中操作,看代码:

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.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(); //初始化启动模块
        }
    }

OK,这样子,我们就完成了基本操作了。下面开始应用了

先创建一个IUserService接口和一个UserService服务,代码分别如下:

namespace WebApplication1.Models
{
    public interface IUserService
    {
        string GetName();
    }
}
using Volo.Abp.DependencyInjection;

namespace WebApplication1.Models
{
    public class UserService : IUserService, IScopedDependency
    {
        public string GetName()
        {
            return "张三";
        }
    }
}

接着控制器中使用

using Microsoft.AspNetCore.Mvc;
using Volo.Abp.AspNetCore.Mvc;
using WebApplication1.Models;

namespace WebApplication1.Controllers
{
    public class HomeController : AbpController //控制器继承 AbpController
    {

        private readonly IUserService _userService;
        public HomeController(IUserService userService) {
            _userService = userService;
        }

        public IActionResult Index()
        {
            return Content(_userService.GetName());
        }

    }
}

启动项目,浏览

 

 

这样,调用就成功了。我们就完成了mvc中的基本使用了。

本章结束。

 示例代码地址:https://gitee.com/fei686868/abpvnext-learning-shili

 

更多分享,请大家关注我的个人公众号:

posted @ 2021-03-17 14:41  黄明辉  阅读(3265)  评论(2编辑  收藏  举报