标签:tin url readonly this out 定义 富文本 isa wak
上次翻译的ABP vNext介绍发布后,引起了很多ABP好爱者的关注.
那么就趁热打铁,体验一下新ABP.
新的ABP中我最感兴趣的是它的模板系统,所以这次就利用模块系统做了留言板的例子,分享给大家.
我们的留言板模块功能很简单,就是提供用户留言的功能(废话),为了简单起见,功能都非常简陋:
使用ABP的模块系统将以上功能涉及的数据库,API,UI等打包为一个模块,以便在以后的项目中复用(这么简陋还想复用?)
注意
- 读者最好开发过ABP,对于ABP的基础知识(如Entity,Repository,Application Service等)有一定的理解
- 文中的代码写法仅为测试和功能验证,有可能未遵循ABP的最佳实践,请不要直接用在实际项目中
Ready? Let‘s go to Next!
创建模块工程
使用官网提供的模板,注意选择ASP.NET Core Mvc Module
,创建一个模块工程,命名为WAKU.MessageBoard
:
用VS2017打开模块工程(WAKU.MessageBoard.sln),可以看到模板生成的项目有很多:
这些工程遵循了官方的最佳实践,这里做简要说明:
文件夹 | 工程 | 说明 | 用途 |
---|---|---|---|
app | WAKU.MessageBoard.DemoApp | 测试用WEB工程 | 提供模块开发阶段测试用app |
src | WAKU.MessageBoard.Application | 应用程序服务工程 | 定义Service各个实现类 |
WAKU.MessageBoard.Application.Contracts | 应用程序服务合约工程 | 定义Service各个接口,DTO | |
WAKU.MessageBoard.Domain | 域工程 | 定义Entity | |
WAKU.MessageBoard.Domain.Shared | 域共享工程 | 定义所有工程可共用的常量信息等 | |
WAKU.MessageBoard.EntityFrameworkCore | EF Core工程 | 定义DbContext,提供EF访问数据库的基础设施 | |
WAKU.MessageBoard.HttpApi | HTTP API工程 | 定义控制器,用来暴露应用程序服务中各个方法 | |
WAKU.MessageBoard.HttpApi.Client | HTTP API客户端工程 | 为HTTP API提供客户端服务 | |
WAKU.MessageBoard.MongoDB | MongoDB工程 | 定义DbContext,提供MongoDB访问数据库的基础设施(本文中未使用) | |
WAKU.MessageBoard.Web | WEB工程 | 定义模块使用的页面,视图,脚本等UI相关的资源 | |
tests | - | 各个测试工程 | 定义针对以上工程的测试用例 |
创建Domain
在WAKU.MessageBoard.Domain
工程的WAKU\MessageBoard
下新建一个命为Messages
的文件夹,用来存放留言板的Domain类.
这个例子中,只有留言一个Domain类,在Messages文件夹下创建该Message类,代码如下:
using Volo.Abp.Domain.Entities.Auditing;
namespace WAKU.MessageBoard.Messages
{
public class Message : FullAuditedEntity<int>
{
/// <summary>
/// 标题
/// </summary>
public string Title { get; set; }
/// <summary>
/// 正文
/// </summary>
public string Content { get; set; }
}
}
增加DbContext属性
修改WAKU.MessageBoard.EntityFrameworkCore
工程的WAKU\MessageBoard\EntityFrameworkCore
下的IMessageBoardDbContext
和MessageBoardDbContext
类,增加Message的DbSet属性:
[ConnectionStringName("MessageBoard")]
public interface IMessageBoardDbContext : IEfCoreDbContext
{
DbSet<Message> Messages { get; set; }
}
[ConnectionStringName("MessageBoard")]
public class MessageBoardDbContext : AbpDbContext<MessageBoardDbContext>, IMessageBoardDbContext
{
...
public DbSet<Message> Messages { get; set; }
...
}
创建Repository
修改MessageBoardEntityFrameworkCoreModule
,使用ABP为各Entity创建默认Repository:
[DependsOn(
typeof(MessageBoardDomainModule),
typeof(AbpEntityFrameworkCoreModule)
)]
public class MessageBoardEntityFrameworkCoreModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
context.Services.AddAbpDbContext<MessageBoardDbContext>(options =>
{
// 为全部Entity创建默认Repository
options.AddDefaultRepositories(includeAllEntities: true);
});
}
}
为Message配置model builder
修改MessageBoardDbContextModelCreatingExtensions
如下:
public static class MessageBoardDbContextModelCreatingExtensions
{
public static void ConfigureMessageBoard(
this ModelBuilder builder,
Action<MessageBoardModelBuilderConfigurationOptions> optionsAction = null)
{
...
builder.Entity<Message>(m =>
{
m.ToTable(options.TablePrefix + "Messages", options.Schema);
m.ConfigureFullAudited();
});
}
}
修改数据库连接串
修改WAKU.MessageBoard.DemoApp
工程下的appsettings.json
.将localhost
改为(localdb)\\mssqllocaldb
,这样就可以不用在本地安装Sql Server,而使用Local Db(安装VS2017时默认会安装Local Db)
{
"ConnectionStrings": {
"Default": "Server=(localdb)\\mssqllocaldb;Database=MessageBoardDemoApp;Trusted_Connection=True;MultipleActiveResultSets=true"
}
}
增加数据库迁移
右键点击WAKU.MessageBoard.DemoApp
,选择Set as Startup Project
,将其设置为启动工程
打开Package Manager Console
(PMC),将默认工程也设置为app\WAKU.MessageBoard.DemoApp
,执行以下命令:
Add-Migration "AddMessage"
生成数据库
在PMC中执行Update-Database
生成的数据库位于%userprofile%
文件夹下,名为MessageBoardDemoApp.mdf
可以通过VS2017的菜单View
-> SQL Server Object Explorer
查看生成的数据库,并确认Messages表也正确生成了,表名为MessageBoardMessages
:
为了之后的开发,创建3条测试数据:
创建Service约定
在WAKU.MessageBoard.Application.Contracts
工程的WAKU\MessageBoard
文件夹下,创建Messages\Dto
文件夹,并创建一个名为MessageDto
的类:
public class MessageDto : FullAuditedEntityDto<int>
{
/// <summary>
/// 标题
/// </summary>
[Required]
public string Title { get; set; }
/// <summary>
/// 正文
/// </summary>
[Required]
public string Content { get; set; }
}
在Messages
文件夹下创建IMessageAppService
接口:
public interface IMessageAppService : IAsyncCrudAppService<MessageDto, int>
{
}
我们继承了IAsyncCrudAppService
接口,该接口定义了基本的增删改查(CRUD)方法,已经可以满足我们的需求了,之后可以根据情况再增加新的方法.
创建完成的结构如下:
实现Service
在WAKU.MessageBoard.Application
工程的WAKU\MessageBoard
文件夹下,创建Messages
文件夹,并创建一个名为MessageAppService
的类:
public class MessageAppService : AsyncCrudAppService<Message, MessageDto, int>, IMessageAppService
{
public MessageAppService(IRepository<Message, int> repository) : base(repository)
{
}
}
与IMessageAppService
接口类似,继承了AsyncCrudAppService
类,使用该类默认实现的增删改查方法,就不需要再定义额外的方法了.
创建Controller
在WAKU.MessageBoard.HttpApi
工程的WAKU\MessageBoard
文件夹下,创建MessageController
类,用来暴露Service中的方法:
[RemoteService]
[Area("message_board")]
[Controller]
[ControllerName("Messages")]
[Route("api/message_board/messages")]
[DisableAuditing]
public class MessageController: AbpController, IMessageAppService
{
private readonly IMessageAppService _messageAppService;
public MessageController(IMessageAppService messageAppService)
{
_messageAppService = messageAppService;
}
[HttpGet]
[Route("{id}")]
public Task<MessageDto> GetAsync(int id)
{
return _messageAppService.GetAsync(id);
}
[HttpGet]
[Route("")]
public Task<PagedResultDto<MessageDto>> GetListAsync(PagedAndSortedResultRequestDto input)
{
return _messageAppService.GetListAsync(input);
}
[HttpPost]
public Task<MessageDto> CreateAsync(MessageDto input)
{
return _messageAppService.CreateAsync(input);
}
[HttpPost]
[Route("{id}")]
public Task<MessageDto> UpdateAsync(int id, MessageDto input)
{
return _messageAppService.UpdateAsync(id, input);
}
[HttpDelete]
public Task DeleteAsync(int id)
{
return _messageAppService.DeleteAsync(id);
}
}
可以看出该类只是Service的一个封装,定义了API的路由和参数形式,代码略显繁琐.个人希望能像之前版本一样,由ABP自动生成,估计在将来的版本中会提供.
启动DemoApp
现在我们就已准备好模块需要的基础服务了,启动测试工程WAKU.MessageBoard.DemoApp
,一切正常的话就看到启动页面:
用Swagger测试API
在浏览器的地址栏中增加/swagger
,会进入Swagger的页面:
可以看到Controller中定义的各个方法已经显示出来,我们可以测试一下基本的增删改查功能是否正常,这里测试一下get方法,看看之前的测试数据能否取出:
这里我们通过URL取得id为2的留言,可以看到数据能正常取出.
总结一下我们到现在为止的工作:
到现在为止,我们已经为留言模板实现了~健壮的~基础服务,下一篇我们将使用这些基础服务,做一些稍微实用的功能: 为留言板创建UI,让用户真正的能使用留言功能.
如果你喜欢本文,请点击"推荐",更欢迎留言进行讨论,你的支持是我的最大动力!
标签:tin url readonly this out 定义 富文本 isa wak
原文地址:https://www.cnblogs.com/waku/p/9733367.html