• 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

  • 相关阅读:
    XVIII Open Cup named after E.V. Pankratiev Stage 5: Eastern Grand Prix
    XX Russia Team Open, High School Programming Contest St Petersburg, Barnaul, Tbilisi, Almaty, Kremenchug, November 30, 2019
    2019-2020 ICPC, NERC, Northern Eurasia Finals
    The 2019 China Collegiate Programming Contest Harbin Site
    Southeastern European Regional Programming Contest 2019
    2019-2020 ICPC, Asia Jakarta Regional Contest (Online Mirror, ICPC Rules, Teams Preferred)
    2019-2020 Saint-Petersburg Open High School Programming Contest (SpbKOSHP 19)
    hdu6354 Everything Has Changed (圆的相交弧长)
    hdu6341 Problem J. Let Sudoku Rotate (dfs)
    hdu6333 Problem B. Harvest of Apples(组合数+莫队)
  • 原文地址:https://www.cnblogs.com/fei686868/p/14549273.html
Copyright © 2020-2023  润新知