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