ABP core 的框架在过年期间,从1.0突然升级到2.0了,。 整个ABPCore 虽然版本变化 大,但使用流程基本不变吧, 我看官网上文档更新基本完毕了,官网文档有一个外国人视频,当时版本尚是0.18,总共有2小时吧。边看视频边记录个学习笔记吧!
这个视频课程 被好心人转移到https://www.bilibili.comb , 视频和官方的 使用 ASP.NET Core MVC 入门教程的内容完全一致,而且官方教程似乎略有更新。 但看视频有个好处,就是不用自己敲代码调试了,有人演示给你看。
课程内容主要步骤记录:
【】所包含的是对应项目名
1、生成项目
abp new ,并编译全部
2、修改连接字符串:
【DbMigrator】修改连接字符串,并执行这个项目,就实现数据库的创建和写入种子数据. 这时可以启用【web】登录网站并修改密码
3、添加实体类,业务实体
【Domain】中添加Book, 继承自审计聚合根 auditedAggregateRoot类。 这个类本身实现了一系统接口
4、添加项目的全局的共有类
【domain.shared】中添加BookType的枚举类型。 它是整个解决方案共用的类型
5、在DBContext中注册实体类
【EFCore】中,DbContext中添加DbSet<Book> books;
DbContextModelCreatingExtensions 中添加表名,表属性,外键关系的配置
6、添加迁移文件
【EFC.DbMigrations】 执行add mirgrate "xxx"
7、添加 BookStoreDataSeedContributor
【Domain】中,添加一个类BookStoreDataSeedContributor ,继承自 IDataSeedContributor, ITransientDependency接口,实现SeedAsync方案
类中注入 Repository<Book,Guid> 和 GuidGenerator类型的两个对象, 借助它们来添加种子数据——三本书的信息Book
8、执行【DbMigrator】,更新数据库
不明白为什么第7步中添加的类会自动被识别,ABP应该有什么自动发现的机理。
9、添加DTO类
【Application.Contracts】添加BookDTO类,继承自AuditedEntityDTO<Guid> 。 所有属性和Book相同。
Contracts是协议合同的意思,表示这个对象是应用层的一个实体,用户交互数据的,所以叫Contracts
10,添加实体和DTO的映射关系
【Application】ApplicationAutoMapperProfile.cs文件中,加一句话: CreateMap(Book,BookDto)
11、创建CreateUpdateBookDTO类
【Application.Contracts】添加CreateUpdateBookDTO类。类不继承其它任何类, 成员变量上添加 DataAnnotation ,数据注解!
这个DTO类竟然没有ID这个字段,更新时到底会是什么个机制呢???
12、再添加实体和CreateUpdateBookDTO的映射关系
【Application】 再加一句: CreateMap(CreateUpdateBookDTO,Book)
13、添加第一个IService 接口
【Application.Contracts】 添加 IBookAppService。继承自: ICrudAppService 接口,比较复杂。它包含CRUD的几个方法
注意,视频中,继承的是IAsyncCrudAppService, 但官网示例代码是ICrudAppService。
14、编写IService的实现类
【Application】添加BookAppService的类文件:
构造函数中,注入了Book的仓储对象。
注意,视频中,继承的是AsyncCrudAppService, 但官网示例代码是CrudAppService。
15、浏览自动生成的Swagger 接口,动态JavaScript代理
运行【WEB】项目,浏览 /swagger/index.html ,可以看到通过服务,已经自动生成了相应接口
同时项目生成相应的前端js 代理,可以直接访问API接口
acme.bookStore.book.getList({}).done(function (result) { console.log(result); });
16、 添加BOOK 列表的Razor 的页面
【web】 添加页面 Pages/Books/index.cshtml ,页面继承了 @inherits Acme.BookStore.Web.Pages.BookStorePage
添加菜单 Menus/ BookStoreMenuContributor.cs 中添加
17、添加国际化的内容
【Domain.shared】中添加对应的键的显示内容!
18、编写一个基于 abp UI的表格
【web】 index.cshtml中,添加一组 <abp-*>的标签来写页面,tag-helpers简化页面
添加index.js文件,在js中,用DataTable.js插件来生成表格。 第三方的表格插件已经内置,且abp写了许多辅助的东西来适配第三方的插件
abp.libs.datatables.createAjax
是帮助ABP的动态JavaScript API代理跟Datatable的格式相适应的辅助方法.
19、添加Book的Razor 页面
【Web】 添加 Pages/books/CreateModal.cshtml,并用<abp-dynamic-form>来生成动态表单。
该Razor页面的相应cs文件中,CreateModalModel是要继承 BookStorePageModel 这个类,并注入IBookAppService, 且有一个CreateUpdateBookDto对象:
[BindProperty]
public CreateUpdateBookDto Book { get; set; }
且向该Page 发出Post请求时,要通过IBookAppservice 来提交BooK对象
public async Task<IActionResult> OnPostAsync()
{
await _bookAppService.CreateAsync(Book);
return NoContent();
}
<abp-dynamic-form>标签中, 用apb-model 指定Book对象 ,asp-page="/Books/CreateModel“ 指定提交请求的url.
它子标签是<abp-modal>指示表单是一个弹窗
20、在Index页面上,添加一个创建新书的按钮
【web】 回到 Pages/books/index.cshtml页面上,增加一个<abp-button>按钮,指定id.
回到index.js文件,创建一个abp.ModalManager的对象, 并给按钮增加事件即可。
var createModal = new abp.ModalManager(abp.appPath + 'Books/CreateModal');
createModal.onResult(function () {
dataTable.ajax.reload();
});
$('#NewBookButton').click(function (e) {
e.preventDefault();
createModal.open();
});
隐藏比较深的是abp.ModalManager这个对象,把全部功能都封装起来了
21、添加编辑Book的Razor页面
【Web】 添加/pages/books/EditModal.cshtml页面,它也是<abp-dynamic-form>来生成动态表单. 它与CreateModal相比:
1、页面上增加了: <abp-input asp-for="Id" />
2、 EditModalModel增加:
[HiddenInput]
[BindProperty(SupportsGet = true)]
public Guid Id { get; set; }
还增加了:OnGetAsync()方法用于从数据库请求BookDto对象,然后转化成CreateUpdateBookDto对象。
22、BookDto到CreateUpdateBookDto对象映射
【Web】在WebAutoMapperProfile.cs中,增加BookDto到CreateUpdateBookDto的映射! 前面的映射是在【Application】中增加的
23、在Index页面添加编辑按钮
【web】 在Index页面增加操作列,然后去index.js中,用dataTable.js的功能,为表格添加一个按钮列。
index.js上增加另一个abp.ModalManger对象用于编辑Book,它弹出时,增加一个 { id: xxxx} 的值
var editModal = new abp.ModalManager(abp.appPath + 'Books/EditModal');
editModal.open({ id: data.record.id });
editModal.onResult(function () {
dataTable.ajax.reload();
});
24、删除一个Book记录
【web】 直接 通过javascript代理方法 acme.bookStore.book.delete 来删除。 删除元素不需要界面。
这里演示了”国际化时,字符串插值“的技术 。国际化内容中,用 { 0 } 来占位!
25、测试-------习惯性略过
来源:oschina
链接:https://my.oschina.net/u/1540190/blog/3165071