From 4f3f3a0bb2bc90e0260fe3cd65c403b9d1fbf601 Mon Sep 17 00:00:00 2001 From: maliming Date: Tue, 4 Jun 2019 11:22:45 +0800 Subject: [PATCH] Translating documents. --- docs/docs-langs.json | 2 +- .../AspNetCore/Auto-API-Controllers.md | 4 +- docs/zh-Hans/CLI.md | 137 +++++++++++++ docs/zh-Hans/Data-Seeding.md | 3 + ...Getting-Started-AspNetCore-MVC-Template.md | 69 +++++-- docs/zh-Hans/Index.md | 92 +++------ docs/zh-Hans/Startup-Templates/Index.md | 8 + docs/zh-Hans/Startup-Templates/Mvc-Module.md | 6 + docs/zh-Hans/Startup-Templates/Mvc.md | 183 ++++++++++++++++++ .../Tutorials/AspNetCore-Mvc/Part-I.md | 142 ++++++++------ .../Tutorials/AspNetCore-Mvc/Part-II.md | 66 +++---- .../Tutorials/AspNetCore-Mvc/Part-III.md | 89 +++------ .../images/bookstore-add-create-dialog-v2.png | Bin 0 -> 3164 bytes .../images/bookstore-add-create-dialog.png | Bin 8437 -> 0 bytes .../images/bookstore-add-index-page-v2.png | Bin 0 -> 8081 bytes .../images/bookstore-add-index-page.png | Bin 8699 -> 0 bytes .../images/bookstore-appservice-tests.png | Bin 0 -> 16291 bytes .../images/bookstore-index-js-file-v2.png | Bin 0 -> 2984 bytes .../images/bookstore-index-js-file.png | Bin 3592 -> 0 bytes .../bookstore-localization-files-v2.png | Bin 0 -> 6323 bytes .../images/bookstore-localization-files.png | Bin 5416 -> 0 bytes .../images/bookstore-test-projects-v2.png | Bin 0 -> 6864 bytes .../images/bookstore-test-projects.png | Bin 7399 -> 0 bytes .../bookstore-visual-studio-solution-v2.png | Bin 8946 -> 0 bytes .../bookstore-visual-studio-solution-v3.png | Bin 0 -> 12919 bytes .../bookstore-visual-studio-solution.png | Bin 7369 -> 0 bytes docs/zh-Hans/Value-Types.md | 3 + docs/zh-Hans/docs-nav.json | 4 + .../images/bookstore-user-management-v2.png | Bin 0 -> 18879 bytes .../images/bookstore-user-management.png | Bin 19157 -> 0 bytes .../bookstore-visual-studio-solution-v2.png | Bin 8946 -> 0 bytes .../bookstore-visual-studio-solution-v3.png | Bin 0 -> 12919 bytes .../bookstore-visual-studio-solution.png | Bin 7369 -> 0 bytes docs/zh-Hans/images/db-migrator-app.png | Bin 0 -> 11903 bytes 34 files changed, 563 insertions(+), 245 deletions(-) create mode 100644 docs/zh-Hans/CLI.md create mode 100644 docs/zh-Hans/Data-Seeding.md create mode 100644 docs/zh-Hans/Startup-Templates/Index.md create mode 100644 docs/zh-Hans/Startup-Templates/Mvc-Module.md create mode 100644 docs/zh-Hans/Startup-Templates/Mvc.md create mode 100644 docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-add-create-dialog-v2.png delete mode 100644 docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-add-create-dialog.png create mode 100644 docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-add-index-page-v2.png delete mode 100644 docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-add-index-page.png create mode 100644 docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-appservice-tests.png create mode 100644 docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-index-js-file-v2.png delete mode 100644 docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-index-js-file.png create mode 100644 docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-localization-files-v2.png delete mode 100644 docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-localization-files.png create mode 100644 docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-test-projects-v2.png delete mode 100644 docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-test-projects.png delete mode 100644 docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-visual-studio-solution-v2.png create mode 100644 docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-visual-studio-solution-v3.png delete mode 100644 docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-visual-studio-solution.png create mode 100644 docs/zh-Hans/Value-Types.md create mode 100644 docs/zh-Hans/images/bookstore-user-management-v2.png delete mode 100644 docs/zh-Hans/images/bookstore-user-management.png delete mode 100644 docs/zh-Hans/images/bookstore-visual-studio-solution-v2.png create mode 100644 docs/zh-Hans/images/bookstore-visual-studio-solution-v3.png delete mode 100644 docs/zh-Hans/images/bookstore-visual-studio-solution.png create mode 100644 docs/zh-Hans/images/db-migrator-app.png diff --git a/docs/docs-langs.json b/docs/docs-langs.json index 30cd8d3813..851c67d605 100644 --- a/docs/docs-langs.json +++ b/docs/docs-langs.json @@ -6,7 +6,7 @@ "IsDefault": true }, { - "DisplayName" : "Chinese", + "DisplayName" : "简体中文", "Code" : "zh-Hans", "IsDefault": false } diff --git a/docs/zh-Hans/AspNetCore/Auto-API-Controllers.md b/docs/zh-Hans/AspNetCore/Auto-API-Controllers.md index afe8ea700b..f31b4d67cb 100644 --- a/docs/zh-Hans/AspNetCore/Auto-API-Controllers.md +++ b/docs/zh-Hans/AspNetCore/Auto-API-Controllers.md @@ -16,7 +16,9 @@ public class BookStoreWebModule : AbpModule { Configure(options => { - options.ConventionalControllers.Create(typeof(BookStoreApplicationModule).Assembly); + options + .ConventionalControllers + .Create(typeof(BookStoreApplicationModule).Assembly); }); } } diff --git a/docs/zh-Hans/CLI.md b/docs/zh-Hans/CLI.md new file mode 100644 index 0000000000..d210560910 --- /dev/null +++ b/docs/zh-Hans/CLI.md @@ -0,0 +1,137 @@ +# ABP CLI + +ABP CLI (Command Line Interface) is a command line tool to perform some common operations for ABP based solutions. + +## Installation + +ABP CLI is a [dotnet global tool](https://docs.microsoft.com/en-us/dotnet/core/tools/global-tools). Install it using a command line window: + +````bash +dotnet tool install -g Volo.Abp.Cli +```` + +To update an existing installation: + +````bash +dotnet tool update -g Volo.Abp.Cli +```` + +## Commands + +### new + +Generates a new solution based on the ABP [startup templates](Startup-Templates/Index.md). + +Basic usage: + +````bash +abp new [options] +```` + +Example: + +````bash +abp new Acme.BookStore +```` + +* Acme.BookStore is the solution name here. +* Common convention is to name a solution is like *YourCompany.YourProject*. However, you can use different naming like *YourProject* (single level namespacing) or *YourCompany.YourProduct.YourModule* (three levels namespacing). + +#### Options + +* `--template` or `-t`: Specifies the template name. Default template name is `mvc`. Available templates: + * `mvc` (default): ASP.NET Core [MVC application template](Startup-Templates/Mvc.md). Additional options: + * `--database-provider` or `-d`: Specifies the database provider. Default provider is `ef`. Available providers: + * `ef`: Entity Framework Core. + * `mongodb`: MongoDB. + * `--tiered`: Creates a tiered solution where Web and Http API layers are physically separated. If not specified, it creates a layered solution which is less complex and suitable for most scenarios. + * `mvc-module`: ASP.NET Core [MVC module template](Startup-Templates/Mvc-Module.md). Additional options: + * `--no-ui`: Specifies to not include the UI. This makes possible to create service-only modules (a.k.a. microservices - without UI). +* `--output-folder` or `-o`: Specifies the output folder. Default value is the current directory. + +### add-package + +Adds a new ABP package to a project by, + +* Adding related nuget package as a dependency to the project. +* Adding `[DependsOn(...)]` attribute to the module class in the project (see the [module development document](Module-Development-Basics.md)). + +> Notice that the added module may require additional configuration which is generally indicated in the documentation of the related package. + +Basic usage: + +````bash +abp add-package [options] +```` + +Example: + +```` +abp add-package Volo.Abp.MongoDB +```` + +* This example adds the Volo.Abp.MongoDB package to the project. + +#### Options + +* `--project` or `-p`: Specifies the project (.csproj) file path. If not specified, CLI tries to find a .csproj file in the current directory. + +### add-module + +Adds a multi-package module to a solution by finding all packages of the module, finding related projects in the solution and adding each package to the corresponding project in the solution. + +> A business module generally consists of several packages (because of layering, different database providr options or other reasons). Using `add-module` command dramatically simplifies adding a module to a solution. However, each module may require some additional configurations which is generally indicated in the documentation of the related module. + +Basic usage: + +````bash +abp add-module [options] +```` + +Example: + +```bash +abp add-module Volo.Blogging +``` + +* This example add the Volo.Blogging module to the solution. + +#### Options + +* `--solution` or `-s`: Specifies the solution (.sln) file path. If not specified, CLI tries to find a .sln file in the current directory. +* `--skip-db-migrations`: For EF Core database provider, it automatically adds a new code first migration (`Add-Migration`) and updates the database (`Update-Database`) if necessary. Specify this option to skip this operation. + +### update + +Updating all ABP related packages can be tedious since there are many packages of the framework and modules. This command automatically updates all ABP related packages in a solution or project to the latest versions. + +Usage: + +````bash +abp update [options] +```` + +* If you run in a directory with a .sln file, it updates all ABP related packages of the all projects of the solution to the latest versions. +* If you run in a directory with a .csproj file, it updates all ABP related packages of the project to the latest versions. + +#### Options + +* `--include-previews` or `-p`: Includes preview, beta and rc packages while checking the latest versions. + +### help + +Writes basic usage information of the CLI. + +Usage: + +````bash +abp help [command-name] +```` + +Examples: + +````bash +abp help # Shows a general help. +abp help new # Shows help about the "new" command. +```` + diff --git a/docs/zh-Hans/Data-Seeding.md b/docs/zh-Hans/Data-Seeding.md new file mode 100644 index 0000000000..0b424e7e0d --- /dev/null +++ b/docs/zh-Hans/Data-Seeding.md @@ -0,0 +1,3 @@ +# Data Seeding + +TODO \ No newline at end of file diff --git a/docs/zh-Hans/Getting-Started-AspNetCore-MVC-Template.md b/docs/zh-Hans/Getting-Started-AspNetCore-MVC-Template.md index e8ce4fa71a..cef3b1f003 100644 --- a/docs/zh-Hans/Getting-Started-AspNetCore-MVC-Template.md +++ b/docs/zh-Hans/Getting-Started-AspNetCore-MVC-Template.md @@ -2,37 +2,42 @@ ### 创建新项目 -访问[模板创建页面](https://abp.io/Templates), 输入项目名称并创建项目, 如下所示: +本教程使用 **ABP CLI** 创建一个新项目. 更多选项, 请参阅[入门](https://cn.abp.io/get-started)页面. -![bookstore-create--template](images/bookstore-create-template.png) +如果你之前未安装,请使用命令行安装ABP CLI: -单击 *create* 按钮时,将使用你提供的名称创建一个新的Visual Studio解决方案并开始下载. +````bash +dotnet tool install -g Volo.Abp.Cli +```` + +在空文件夹中使用 `abp new` 命令来创建项目: + +```` +abp new Acme.BookStore +```` + +> 你可以使用不同级别的命名空间; 例如BookStore, Acme.BookStore或Acme.Retail.BookStore. + +`new` 命令创建**分层MVC应用程序**, **Entity Framework Core**作为数据库提供程序. 但是,它还有其他选择. 有关所有可用选项,请参见[CLI文档](CLI.md) #### 预先要求 -下载的项目需要: +创建项目的要求: * [Visual Studio 2017 (v15.9.0+)](https://visualstudio.microsoft.com/tr/downloads/) -* [.NET Core 2.1.1+](https://www.microsoft.com/net/download/dotnet-core/) +* [.NET Core 2.2+](https://www.microsoft.com/net/download/dotnet-core/) ### 解决方案结构 -下载后解压文件并在 **Visual Studio 2017(15.7.0 +)** 中打开: - -![bookstore-visual-studio-solution](images/bookstore-visual-studio-solution-v2.png) - -该解决方案具有分层结构(基于域驱动设计), 其中: +在**Visual Studio**中打开解决方案: -* ``.Domain`` 为领域层. -* ``.Application`` 为应用层. -* ``.Web`` 为是表示层. -* ``.EntityFrameworkCore`` 是EF Core集成. +![bookstore-visual-studio-solution](images/bookstore-visual-studio-solution-v3.png) -EF Core 数据库迁移被分离到名为`.EntityFrameworkCore.DbMigrations`项目中. +该解决方案具有分层结构(基于[Domain Driven Design](Domain-Driven-Design.md)), 并包含配置好的的单元&集成测试项目,可与**EF Core**和**SQLite**数据库内存一起使用. -解决方案还包含配置好的的单元&集成测试项目, 以便与 **EF Core** 和 **SQLite内存中** 数据库配合使用. +> 请参阅[MVC应用程序模板文档](Startup-Templates/Mvc.md)以详细了解解决方案结构. -### 创建数据库 +### 数据库连接字符串 查看`.Web`项目下`appsettings.json`文件中的 **连接字符串**: @@ -44,9 +49,29 @@ EF Core 数据库迁移被分离到名为`.EntityFrameworkCore.DbMigrations`项 } ```` -解决方案使用 **Entity Framework Core** 和 **MS SQL Server**. EF Core支持[各种](https://docs.microsoft.com/en-us/ef/core/providers/)数据库提供程序,因此你可以根据实际需要使用其他DBMS. +解决方案使用 **Entity Framework Core** 和 **MS SQL Server**. EF Core支持[各种](https://docs.microsoft.com/en-us/ef/core/providers/)数据库提供程序,因此你可以根据实际需要使用其他DBMS. 如果需要,请更改连接字符串. + +### 创建数据库并应用数据库迁移 + +你有两个选项来创建数据库. -右键单击`.Web`项目并**设置启动项目** +#### 使用DbMigrator应用程序 + +该解决方案包含一个控制台应用程序(在此示例中名为`Acme.BookStore.DbMigrator`),可以创建数据库,应用迁移和初始化数据. 它对开发和生产环境都很有用. + +> `.DbMigrator`项目有自己的`appsettings.json`. 因此,如果你更改了上面的连接字符串,则还应更改此字符串. + +右键单击`.DbMigrator`项目并选择 **设置为启动项目**: + +![set-as-startup-project](images/set-as-startup-project.png) + +按F5(或Ctrl + F5)运行应用程序. 它将具有如下所示的输出: + +![set-as-startup-project](images/db-migrator-app.png) + +#### 使用EF Core Update-Database命令 + +Ef Core具有`Update-Database`命令, 可根据需要创建数据库并应用挂起的迁移. 右键单击`.Web`项目并选择**设置为启动项目**: ![set-as-startup-project](images/set-as-startup-project.png) @@ -56,6 +81,8 @@ EF Core 数据库迁移被分离到名为`.EntityFrameworkCore.DbMigrations`项 这将基于配置的连接字符串创建新数据库. +> 使用`.Migrator`工具是建议的方法, 因为它还能初始化初始数据能够正确运行Web应用程序. + ### 运行应用程序 你现在可以运行应用程序,它将会打开**home**页面: @@ -64,9 +91,9 @@ EF Core 数据库迁移被分离到名为`.EntityFrameworkCore.DbMigrations`项 单击 **登录** 按钮, 输入用户名`admin`, 密码`1q2w3E*`, 登录应用程序. -启动模板包括 **身份管理(identity management)** 模块. 登录后将提供身份管理菜单,你可以在其中管理**角色**,**用户**及其**权限**. +启动模板包括**身份管理**和**租户管理**模块. 登录后,将显示"管理"菜单, 你可以在其中管理**租户**,**角色**,**用户**和**权限**. 用户管理页面如下所示: -![bookstore-user-management](images/bookstore-user-management.png) +![bookstore-user-management](images/bookstore-user-management-v2.png) ### 下一步是什么? diff --git a/docs/zh-Hans/Index.md b/docs/zh-Hans/Index.md index e14bd67fa5..fbe003b8e7 100644 --- a/docs/zh-Hans/Index.md +++ b/docs/zh-Hans/Index.md @@ -1,68 +1,32 @@ # ABP 文档 -> 翻译来自[cnAbp](https://github.com/cnabp)组织,中文网会持续跟进翻译,目前Abp vNext的英文文档还未完成,大家对整体框架没有深入的理解,翻译难免存在一些问题.敬请见谅.😀 +> 中文文档翻译来自[cnAbp](https://github.com/cnabp)组织,Abp中文网会持续跟进翻译,目前Abp vNext的英文文档还未完成,大家对整体框架没有深入的理解,翻译难免存在一些问题.敬请见谅.😀 -## 目录 +ABP是一个**开源应用程序框架**,专注于基于ASP.NET Core的Web应用程序开发,但也支持开发其他类型的应用程序. -* 入门 - * 从启动模板开始 - * [ASP.NET Core MVC 模板](Getting-Started-AspNetCore-MVC-Template.md) - * 从空项目开始 - * [使用Console Application](Getting-Started-Console-Application.md) - * [使用 ASP.NET Core Web Application](Getting-Started-AspNetCore-Application.md) -* 教程 - * 应用开发 - * [使用 ASP.NET Core MVC](Tutorials/AspNetCore-Mvc/Part-I.md) -* 基础知识 - * [依赖注入](Dependency-Injection.md) - * AutoFac 集成 - * [虚拟文件系统](Virtual-File-System.md) - * [本地化](Localization.md) - * [异常处理](Exception-Handling.md) - * 验证 - * 授权 - * 缓存 - * 审计 - * 设置管理 - * 对象映射 - * AutoMapper 集成 -* 事件 - * 本地 Event Bus - * 分布式 Event Bus - * RabbitMQ 集成 -* 服务 - * 对象序列化 - * JSON序列化 - * 邮件 - * GUIDs - * 线程 - * 定时 -* [多租户](Multi-Tenancy.md) -* 模块开发 - * [基础](Module-Development-Basics.md) - * 模块插件 - * [最佳实践](Best-Practices/Index.md) -* 领域驱动设计 - * 领域层 - * [实体&聚合根](Entities.md) - * 值对象 - * [仓储](Repositories.md) - * 领域服务 - * 规约 - * 应用服务层 - * 应用服务 - * 数据传输对象(DTO) - * 工作单元 -* ASP.NET Core MVC - * API 版本控制 - * 用户界面 - * [客户端包管理](AspNetCore/Client-Side-Package-Management.md) - * [捆绑&压缩](AspNetCore/Bundling-Minification.md) - * [Tag Helpers](Tag-Helpers.md) - * [主题](AspNetCore/Theming.md) -* 后台服务 - * [后台作业](Background-Jobs.md) -* 数据访问 - * [Entity Framework Core 集成](Entity-Framework-Core.md) - * [MongoDB 集成](MongoDB.md) -* 测试 +浏览左侧导航菜单以深入了解文档. + +## 项目状态 + +ABP是开源[ASP.NET Boilerplate](https://aspnetboilerplate.com/)框架的**下一代框架**, 它目前处于早期预览阶段,尚未准备好在生产中使用. 文档仍在进行中,远未完成. + +对于短期和生产级应用程序, 建议使用[ASP.NET Boilerplate](https://aspnetboilerplate.com/)框架,该框架具有丰富的功能集,成熟,积极维护和最新. + +## 入门 + +使用ABP开发新项目的最简单方法是使用启动模板: + +* [ASP.NET Core MVC 模板](Getting-Started-AspNetCore-MVC-Template.md) + +如果您想从头开始(使用空项目),请手动安装ABP框架并使用以下教程: + +* [控制台应用程序](Getting-Started-Console-Application.md) +* [ASP.NET Core Web 应用程序](Getting-Started-AspNetCore-Application.md) + +## 源码 + +ABP托管在GitHub上, 参见[源代码](https://github.com/abpframework/abp). + +## 贡献代码 + +ABP是一个社区驱动的开源项目.如果你想成为该项目的一部分,请参阅[贡献指南](Contribution/Index.md). diff --git a/docs/zh-Hans/Startup-Templates/Index.md b/docs/zh-Hans/Startup-Templates/Index.md new file mode 100644 index 0000000000..c4c75bbedb --- /dev/null +++ b/docs/zh-Hans/Startup-Templates/Index.md @@ -0,0 +1,8 @@ +# 启动模板 + +虽然你可以从一个空项目开始并手动添加所需的包,但启动模板可以非常轻松,舒适地使用ABP框架启动新的解决方案. + +单击下面列表中的名称以查看相关启动模板的文档: + +* [**mvc**](Mvc.md): ASP.NET Core MVC应用程序模板. +* [**mvc-module**](Mvc-Module.md): ASP.NET Core MVC模块/服务模板. \ No newline at end of file diff --git a/docs/zh-Hans/Startup-Templates/Mvc-Module.md b/docs/zh-Hans/Startup-Templates/Mvc-Module.md new file mode 100644 index 0000000000..9f19f83278 --- /dev/null +++ b/docs/zh-Hans/Startup-Templates/Mvc-Module.md @@ -0,0 +1,6 @@ +# MVC Module 启动模板 + +TODO + + + diff --git a/docs/zh-Hans/Startup-Templates/Mvc.md b/docs/zh-Hans/Startup-Templates/Mvc.md new file mode 100644 index 0000000000..b44105a4f6 --- /dev/null +++ b/docs/zh-Hans/Startup-Templates/Mvc.md @@ -0,0 +1,183 @@ +# MVC Application Startup Template + +## Introduction + +This template provides a layered (or tiered, based on the preference) application structure based on the [Domain Driven Design](../Domain-Driven-Design.md) (DDD) practices. + +## How to Start With + +You can use the [ABP CLI](../CLI.md) to create a new project using this startup template. Alternatively, you can directly create & download from the [Get Started](https://abp.io/get-started) page. CLI approach is used here. + +First, install the ABP CLI as described in [its document](../CLI.md). Then use the `abp new` command in an empty folder to create a new solution: + +````bash +abp new Acme.BookStore -t mvc +```` + +* `Acme.BookStore` is the solution name, like *YourCompany.YourProduct*. See the [CLI document](../CLI.md) for different naming styles. +* This example specified the template name (`-t` or `--template` option). However, `mvc` is the default template and used even if you don't specify it. + +### Specify Database Provider + +This template supports the following database providers: + +- `ef`: Entity Framework Core (default) +- `mongodb`: MongoDB + +Use the `-d` (or `--database-provider`) to specify the database provider: + +````bash +abp new Acme.BookStore -t mvc -d mongodb +```` + +### Create a Tiered Solution + +`--tiered` option is used to create a tiered solution where Web and Http API layers are physically separated. If not specified, it creates a layered solution which is less complex and suitable for most scenarios. + +````bash +abp new Acme.BookStore --tiered +```` + +See the "Tiered Structure" section below for the tiered approach. + +## Solution Structure + +Based on the options you've specified, you will get a slightly different solution structure. + +### Default Structure + +If you don't specify any option, you will have a solution like shown below: + +![bookstore-visual-studio-solution-v3](../images/bookstore-visual-studio-solution-v3.png) + +Projects are organized in `src` and `test` folders. `src` folder contains the actual application which is layered based on [DDD](../Domain-Driven-Design.md) principles as mentioned before. + +-------------------- + +**TODO: Add a graphic to illustrate dependencies between projects.** + +------------------ + +Each section below will explain the related project. + +#### .Domain Project + +This is the domain layer of the solution. It mainly contains [entities, aggregate roots](../Entities.md), [domain services](../Domain-Services.md), [value types](../Value-Types.md), [repository interfaces](../Repositories.md) and other domain objects of the solution. + +A `Book` entity and a `IBookRepository` interface are good candidates for this project. + +* Depends on the `.Domain.Shared` because it uses constants, enums and other objects defined in that project. + +#### .Domain.Shared Project + +This project contains constants, enums and other objects these are actually a part of the domain layer, but needed to be used by all layers/projects in the solution. + +A `BookType` enum and a `BookConts` class (which may have some constant fields for the `Book` entity, like `MaxNameLength`) are good candidates for this project. + +This project has no dependency to other projects in the solution. + +#### .Application.Contracts Project + +This project mainly contains [application service](../Application-Services.md) **interfaces** and [Data Transfer Objects](../Data-Transfer-Objects.md) (DTO) of the application layer. It does exists to separate interface & implementation of the application layer. In this way, the interface project can be shared to the clients as a contract package. + +* Depends on the `.Domain.Shared` because it may use constants, enums and other shared objects in the application service interfaces and DTOs. + +#### .Application Project + +This project contains the [application service](../Application-Services.md) implementations of the interfaces defined in the `.Application.Contracts` project. + +* Depends on the `.Application.Contracts` project to be able to implement the interfaces and use the DTOs. +* Depends on the `.Domain` project to be able to use domain objects (entities, repository interfaces... etc.) to perform the application logic. + +#### .EntityFrameworkCore Project. + +This is the integration project for the EF Core. It defines the `DbContext` and implements repository interfaces defined in the `.Domain` project. + +* Depends on the `.Domain` project to be able to reference to entities and repository interfaces. + +> This project is available only if you are using EF Core as the database provider. + +#### .EntityFrameworkCore.DbMigrations Project + +Contains EF Cor database migrations for the solution. It has a separated `DbContext` to dedicated to manage migrations. + +ABP is a modular framework and with an ideal design, each module has its own `DbContext` class. This is where the migration `DbContext` comes into play and unifies all `DbContext` configurations into a single model to maintain a single database schema. + +Notice that the migration `DbContext` is only used for database migrations and *not used on runtime*. + +* Depends on the `.EntityFrameworkCore` project since it re-uses the configuration defined for the `DbContext` of the application. + +> This project is available only if you are using EF Core as the database provider. + +#### .DbMigrator Project + +This is a console application which simplifies to execute database migrations on development and production environments. When you this application; + +* Creates the database if necessary. +* Applies database migrations. +* Seeds initial data. + +> This project has its own `appsettings.json` file. So, if you want to change the database connection string, remember to change this file. + +Especially, seeding initial data is important at this point. ABP has a modular data seed infrastructure. See [its documentation](../Data-Seeding.md) for more about the data seeding. + +While creating database & applying migrations seems only necessary for relational databases, this projects comes even if you choose a NoSQL database provider (like MongoDB). In that case, it still seeds initial data which is necessary for the application. + +* Depends on the `.EntityFrameworkCore.DbMigrations` project (for EF Core) since it needs to access to the migrations. +* Depends on the `.Application.Contracts` project to be able to access permission definitions, because initial data seeder grants permissions for the admin user. + +#### .HttpApi Project + +This project is used to define your API Controllers. + +Most of time you don't need to manually define API Controllers since ABP's [Auto API Controllers](../AspNetCore/Auto-API-Controllers.md) feature creates them automagically based on your application layer. However, in case of you need to write API controllers, this is the best place to do it. + +* Depends on the `.Application.Contracts` project to be able to inject the application service interfaces. + +#### .HttpApi.Client Project + +This is a project that defines C# client proxies to use the HTTP APIs of the solution. You can share this library to 3rd-party clients, so they can easily consume your HTTP APIs in their Dotnet applications. + +`.HttpApi.Client.ConsoleTestApp` project is a console application created to demonstrate the usage of the client proxies. + +Most of time you don't need to manually create C# client proxies, thanks to ABP's [Cynamic C# API Clients](../AspNetCore/Dynamic-CSharp-API-Clients.md) feature. + +* Depends on the `.Application.Contracts` project to be able to share the same application service interfaces and DTOs with the remote service. + +#### .Web Project + +This project contains the User Interface (UI) of the application. It contains razor pages, javascript files, css files, images and so on... + +* Depends on the `.HttpApi` since UI layer needs to use APIs and application service interfaces of the solution. + +> If you check the source code of the `.Web.csproj` file, you will see the references to the `.Application` and the `.EntityFrameworkCore.DbMigrations` projects. +> +> These references are actually not needed on development, because UI layer normally doesn't depend on the EF Core or the Application implementation. This startup templates are ready for the tiered deployment, where API layer is hosted in a separate server than the UI layer. +> +> However, if you don't choose the `--tiered` option, these references will be in the .Web project to be able to host the Web, API and application layers in a single application endpoint. +> +> This gives you to ability to use domain entities in your presentation layer. However, this is considered as a bad practice according to the DDD. + +#### Test Projects + +The solution has multiple test projects, one for each layer: + +* `.Domain.Tests` is used to test the domain layer. +* `.Application.Tests` is used to test the application layer. +* `.EntityFrameworkCore.Tests` is used to test EF Core configuration and custom repositories. +* `.Web.Tests` is used to test the UI. +* `.TestBase` is a base (shared) project for all tests. + +In addition, `.HttpApi.Client.ConsoleTestApp` is a console application (not an automated test project) which demonstrate the usage of HTTP APIs from a Dotnet application. + +### Tiered Structure + +TODO + +### Other Database Providers + +TODO + +#### MongoDB + +TODO \ No newline at end of file diff --git a/docs/zh-Hans/Tutorials/AspNetCore-Mvc/Part-I.md b/docs/zh-Hans/Tutorials/AspNetCore-Mvc/Part-I.md index d3e8af3523..c0f453d878 100644 --- a/docs/zh-Hans/Tutorials/AspNetCore-Mvc/Part-I.md +++ b/docs/zh-Hans/Tutorials/AspNetCore-Mvc/Part-I.md @@ -2,7 +2,7 @@ ### 关于本教程 -本教程中,你会创建一个用于管理书籍和书籍作者的程序.会用到 **Entity Framework Core** (EF Core)作为ORM([启动模板](https://abp.io/Templates)中预配置的ORM). +在本系列教程中, 你将构建一个用于管理书籍及其作者列表的应用程序. **Entity Framework Core**(EF Core)将用作ORM提供者,因为它是默认数据库提供者. 这是本教程所有章节中的第一章,下面是所有的章节: @@ -10,35 +10,37 @@ - [Part II: 创建,编辑,删除书籍](Part-II.md) - [Part III: 集成测试](Part-III.md) -你可以从[这里](https://github.com/volosoft/abp/tree/master/samples/BookStore)下载本程序的源码. +你可以从[GitHub存储库](https://github.com/volosoft/abp/tree/master/samples/BookStore)访问应用程序的**源代码**. ### 创建项目 -打开[启动模板页](https://abp.io/Templates)并下载一个新的项目叫做`Acme.BookStore`.根据[模板文档](../../Getting-Started-AspNetCore-MVC-Template.md)创建数据库并运行这个程序. +创建一个名为`Acme.BookStore`的新项目, 创建数据库并按照[入门文档](../../Getting-Started-AspNetCore-MVC-Template.md)运行应用程序. ### 解决方案的结构 下面的图片展示了从启动模板创建的项目是如何分层的. -![bookstore-visual-studio-solution](images/bookstore-visual-studio-solution-v2.png) +![bookstore-visual-studio-solution](images/bookstore-visual-studio-solution-v3.png) + +> 你可以查看[MVC应用程序模板文档](../../Startup-Templates/Mvc.md)以详细了解解决方案结构.但是,你将通过本教程了解基础知识. ### 创建Book实体 -在 **领域层** 定义[实体](../../Entities.md)(`Acme.BookStore.Domain` 项目中).这个项目最主要的实体就是`Book`: +启动模板中的域层分为两个项目: + + - `Acme.BookStore.Domain`包含你的[实体](../../Entities.md), [领域服务](../../Domain-Services.md)和其他核心域对象. + - `Acme.BookStore.Domain.Shared`包含可与客户共享的常量,枚举或其他域相关对象. + +在解决方案的**领域层**(`Acme.BookStore.Domain`项目)中定义[实体](../../Entities.md). 该应用程序的主要实体是`Book`. 在`Acme.BookStore.Domain`项目中创建一个名为`Book`的类,如下所示: ````C# using System; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; using Volo.Abp.Domain.Entities.Auditing; namespace Acme.BookStore { - [Table("Books")] public class Book : AuditedAggregateRoot { - [Required] - [StringLength(128)] public string Name { get; set; } public BookType Type { get; set; } @@ -50,8 +52,8 @@ namespace Acme.BookStore } ```` -* ABP有两个基本的实体基类: `AggregateRoot` 和 `Entity`.**Aggregate Root**是 **领域驱动设计(DDD)** 的概念之一.更多信息和最佳实践请查看[实体文档](../../Entities.md). -* `Book`实体继承了`AuditedAggregateRoot`,`AuditedAggregateRoot`类在`AggregateRoot`类的基础上添加了一些审计属性(`CreationTime`, `CreatorId`, `LastModificationTime`... 等.). +* ABP为实体提供了两个基本的基类: `AggregateRoot`和`Entity`. **Aggregate Root**是**域驱动设计(DDD)** 概念之一. 有关详细信息和最佳做法,请参阅[实体文档](../../Entities.md). +* `Book`实体继承了`AuditedAggregateRoot`,`AuditedAggregateRoot`类在`AggregateRoot`类的基础上添加了一些审计属性(`CreationTime`, `CreatorId`, `LastModificationTime` 等). * `Guid`是`Book`实体的主键类型. * 使用 **数据注解** 为EF Core添加映射.或者你也可以使用 EF Core 自带的[fluent mapping API](https://docs.microsoft.com/en-us/ef/core/modeling). @@ -62,10 +64,10 @@ namespace Acme.BookStore ````C# namespace Acme.BookStore { - public enum BookType : byte + public enum BookType { Undefined, - Advanture, + Adventure, Biography, Dystopia, Fantastic, @@ -91,14 +93,15 @@ public class BookStoreDbContext : AbpDbContext #### 配置你的Book实体 -从`Acme.BookStore.EntityFrameworkCore` 项目中打开 BookStoreDbContextModelCreatingExtensions.cs 文件, 在 ConfigureBookStore 方法最后添加如下代码来配置Book实体: +在`Acme.BookStore.EntityFrameworkCore`项目中打开`BookStoreDbContextModelCreatingExtensions.cs`文件,并将以下代码添加到`ConfigureBookStore`方法的末尾以配置Book实体: ````C# - builder.Entity(b => - { - b.ToTable(BookStoreConsts.DbTablePrefix + "Books", BookStoreConsts.DbSchema); - b.ConfigureExtraProperties(); - }); +builder.Entity(b => +{ + b.ToTable(BookStoreConsts.DbTablePrefix + "Books", BookStoreConsts.DbSchema); + b.ConfigureAuditedAggregateRoot(); //auto configure for the base class props + b.Property(x => x.Name).IsRequired().HasMaxLength(128); +}); ```` #### 添加新的Migration并更新数据库 @@ -115,26 +118,27 @@ PM> Update-Database #### 添加示例数据 -`Update-Database`命令会在数据库中创建`Books`表.打开这个表添加几行数据,然后就可以把这些数据展示到页面上: +`Update-Database`命令在数据库中创建了`AppBooks`表. 打开数据库并输入几个示例行,以便在页面上显示它们: ![bookstore-books-table](images/bookstore-books-table.png) ### 创建应用服务 -下一步是创建[应用服务](../../Application-Services.md)来管理(创建,列出,更新,删除...)书籍. +下一步是创建[应用服务](../../Application-Services.md)来管理(创建,列出,更新,删除)书籍. 启动模板中的应用程序层分为两个项目: + +* `Acme.BookStore.Application.Contracts`主要包含你的DTO和应用程序服务接口. +* `Acme.BookStore.Application`包含应用程序服务的实现. #### BookDto -在`Acme.BookStore.Application`项目中添加一个名为`BookDto`的DTO类: +在`Acme.BookStore.Application.Contracts`项目中创建一个名为`BookDto`的DTO类: ````C# using System; using Volo.Abp.Application.Dtos; -using Volo.Abp.AutoMapper; namespace Acme.BookStore { - [AutoMapFrom(typeof(Book))] public class BookDto : AuditedEntityDto { public string Name { get; set; } @@ -151,7 +155,23 @@ namespace Acme.BookStore * **DTO**类被用来在 **表示层** 和 **应用层** **传递数据**.查看[DTO文档](../../Data-Transfer-Objects.md)查看更多信息. * 为了在页面上展示书籍信息,`BookDto`被用来将书籍数据传递到表示层. * `BookDto`继承自 `AuditedEntityDto`.跟上面定义的`Book`类一样具有一些审计属性. -* `[AutoMapFrom(typeof(Book))]`用来创建从`Book`类到`BookDto`的AutoMapper映射.使用这种方法.你可以将`Book`对象自动转换成`BookDto`对象(而不是手动复制所有的属性). + +在将书籍返回到表示层时,需要将`Book`实体转换为`BookDto`对象. [AutoMapper](https://automapper.org)库可以在定义了正确的映射时自动执行此转换. 启动模板配置了AutoMapper,因此你只需在`Acme.BookStore.Application`项目的`BookStoreApplicationAutoMapperProfile`类中定义映射: + +````csharp +using AutoMapper; + +namespace Acme.BookStore +{ + public class BookStoreApplicationAutoMapperProfile : Profile + { + public BookStoreApplicationAutoMapperProfile() + { + CreateMap(); + } + } +} +```` #### CreateUpdateBookDto @@ -184,11 +204,17 @@ namespace Acme.BookStore ```` * 这个DTO类被用于在创建或更新书籍的时候从用户界面获取图书信息. -* 类中的属性定义了数据注解(如`[Required]`)用来定义有效性验证.ABP会自动校验DTO的数据有效性. +* 它定义了数据注释属性(如`[Required]`)来定义属性的验证. DTO由ABP框架[自动验证](../../Validation.md). + +就像上面的`BookDto`一样,创建一个从`CreateUpdateBookDto`对象到`Book`实体的映射: + +````csharp +CreateMap(); +```` #### IBookAppService -为应用服务定义一个名为 `IBookAppService` 的接口: +在`Acme.BookStore.Application.Contracts`项目中定义一个名为`IBookAppService`的接口: ````C# using System; @@ -210,15 +236,14 @@ namespace Acme.BookStore } ```` -* 为应用服务定义接口不是必须的,不过,这是推荐的最佳实践. -* `IAsyncCrudAppService`中定义了基础的 **CRUD**方法:`GetAsync`, `GetListAsync`, `CreateAsync`, `UpdateAsync` 和 `DeleteAsync`.不需要扩展它.取而代之,你可以继承空的`IApplicationService`接口定义你自己的方法. -* `IAsyncCrudAppService`有一些变体,你可以为每一个方法使用单个或者多个的DTO.(译者注:意思是类似EntityDto和UpdateEntityDto可以用同一个,也可以分别单独指定 -) +* 框架定义应用程序服务的接口不是必需的. 但是,它被建议作为最佳实践. +* `IAsyncCrudAppService`定义了常见的**CRUD**方法:`GetAsync`,`GetListAsync`,`CreateAsync`,`UpdateAsync`和`DeleteAsync`. 你可以从空的`IApplicationService`接口继承并手动定义自己的方法. +* `IAsyncCrudAppService`有一些变体, 你可以在每个方法中使用单独的DTO,也可以分别单独指定. #### BookAppService -创建 `BookAppService` 并实现 `IBookAppService`接口: +在`Acme.BookStore.Application`项目中实现名为`BookAppService`的`IBookAppService`: ````C# using System; @@ -243,23 +268,23 @@ namespace Acme.BookStore ```` * `BookAppService`继承了`AsyncCrudAppService<...>`.`AsyncCrudAppService<...>`实现了上面定义的CRUD方法. -* `BookAppService`注入了`IRepository`,`IRepository`是默认为`Book`创建的仓储.ABP会自动为每一个聚合根(或实体)创建仓储.参考[仓储文档](../../Repositories.md). -* `BookAppService`使用了 `IObjectMapper` 将`Book`转换成`BookDto`,将`CreateUpdateBookDto`转换成`Book`.启动模板中使用了[AutoMapper](http://automapper.org/)作为对象映射提供程序.你可以像上面那样使用`AutoMapFrom` 和 `AutoMapTo`定义映射.查看[AutoMapper集成文档](../../AutoMapper-Integration.md)获取更多信息. +* `BookAppService`注入`IRepository `,这是`Book`实体的默认仓储. ABP自动为每个聚合根(或实体)创建默认仓储. 请参阅[仓储文档](../../Repositories.md) +* `BookAppService`使用`IObjectMapper`将`Book`对象转换为`BookDto`对象, 将`CreateUpdateBookDto`对象转换为`Book`对象. 启动模板使用[AutoMapper](http://automapper.org/)库作为对象映射提供程序. 你之前定义了映射, 因此它将按预期工作. ### 自动生成API Controllers -你通常需要创建 **Controllers** 将应用服务暴露为 **HTTP API**.这样浏览器或第三方客户端可以通过AJAX的方式访问它们. - -ABP可以通过约定[**自动**](../../AspNetCore/Auto-API-Controllers.md)将应用服务转换成MVC API Controllers. +你通常创建**Controller**以将应用程序服务公开为**HTTP API**端点. 因此允许浏览器或第三方客户端通过AJAX调用它们. ABP可以[**自动**](../../AspNetCore/Auto-API-Controllers.md)按照惯例将你的应用程序服务配置为MVC API控制器. #### Swagger UI -启动模板使用了[Swashbuckle.AspNetCore](https://github.com/domaindrivendev/Swashbuckle.AspNetCore)库配置了[swagger UI](https://swagger.io/tools/swagger-ui/).运行程序并在浏览器中输入`http://localhost:53929/swagger/`. +启动模板配置为使用[Swashbuckle.AspNetCore](https://github.com/domaindrivendev/Swashbuckle.AspNetCore)运行[swagger UI](https://swagger.io/tools/swagger-ui/). 运行应用程序并在浏览器中输入`https://localhost:XXXX/swagger/`(用您自己的端口替换XXXX)作为URL. 你会看到一些内置的接口和`Book`的接口,它们都是REST风格的: ![bookstore-swagger](images/bookstore-swagger.png) +Swagger有一个很好的UI来测试API. 你可以尝试执行`[GET] /api/app/book` API来获取书籍列表. + ### 动态JavaScript代理 在Javascript端通过AJAX的方式调用HTTP API接口是很常见的,你可以使用`$.ajax`或这其他的工具来调用接口.当然,ABP中提供了更好的方式. @@ -270,6 +295,8 @@ ABP **自动** 为所有的API接口创建了JavaScript **代理**.因此,你可 你可以使用你钟爱的浏览器的 **开发者控制台** 中轻松测试JavaScript代理.运行程序,并打开浏览器的 **开发者工具**(快捷键:F12),切换到 **Console** 标签,输入下面的代码并回车: +你现在可以使用自己喜欢的浏览器的**开发者控制台**轻松测试JavaScript代理. 运行应用程序, 打开浏览器的**开发者工具**(快捷键:F12),切换到**Console**选项卡,输入以下代码并按回车键. + ````js acme.bookStore.book.getList({}).done(function (result) { console.log(result); }); ```` @@ -277,7 +304,7 @@ acme.bookStore.book.getList({}).done(function (result) { console.log(result); }) * `acme.bookStore`是`BookAppService`的命名空间,转换成了[驼峰命名](https://en.wikipedia.org/wiki/Camel_case). * `book`是`BookAppService`转换后的名字(去除了AppService后缀并转成了驼峰命名). * `getList`是定义在`AsyncCrudAppService`基类中的`GetListAsync`方法转换后的名字(去除了Async后缀并转成了驼峰命名). -* `{}`参数用来传递一个空的对象给`GetListAsync`方法.GetListAsync期望的参数是`PagedAndSortedResultRequestDto`类型的对象,`PagedAndSortedResultRequestDto`类型中定义了分页和排序选项. +* `{}`参数用于将空对象发送到`GetListAsync`方法,该方法通常需要一个类型为`PagedAndSortedResultRequestDto`的对象,用于向服务器发送分页和排序选项(所有属性都是可选的,所以你可以发送一个空对象). * `getList`方法返回了一个`promise`.因此,你可以传递一个回调函数到`done`(或者`then`)方法中来获取服务返回的结果. 运行这段代码会产生下面的输出: @@ -300,7 +327,7 @@ acme.bookStore.book.create({ name: 'Foundation', type: 7, publishDate: '1951-05- successfully created the book with id: f3f03580-c1aa-d6a9-072d-39e75c69f5c7 ```` -检查数据库表`books`中的数据,你会发现多了一行新数据,你也可以尝试`get`, `update` 和 `delete`方法. +检查数据库中的`Books`表以查看新书. 你可以自己尝试`get`,`update`和`delete`功能. ### 创建书籍页面 @@ -309,20 +336,21 @@ successfully created the book with id: f3f03580-c1aa-d6a9-072d-39e75c69f5c7 在 `Acme.BookStore.Web`项目的`Pages`文件夹下创建一个新的文件夹叫`Books`并添加一个名为`Index.cshtml`的Razor Page. -![bookstore-add-index-page](images/bookstore-add-index-page.png) +![bookstore-add-index-page](images/bookstore-add-index-page-v2.png) 打开`Index.cshtml`并把内容修改成下面这样: ````html @page -@using Acme.BookStore.Pages.Books -@inherits Acme.BookStore.Pages.BookStorePageBase +@using Acme.BookStore.Web.Pages.Books +@inherits Acme.BookStore.Web.Pages.BookStorePageBase @model IndexModel

Books

```` -* 修改Razor View Page Model的默认继承,使页面 **继承** 自`BookStorePageBase`类(代替`PageModel`).`BookStorePageBase`类来自于启动模板,它提供了一些公开的可以被所有的页面使用的属性/方法. +* 此代码更改了Razor View Page Model的默认继承,因此它从`BookStorePageBase`类(而不是`PageModel`)继承.启动模板附带的`BookStorePageBase`类,提供所有页面使用的一些共享属性/方法. +* 确保`IndexModel`(Index.cshtml.cs)具有`Acme.BookStore.Pages.Books`命名空间,或者在`Index.cshtml`中更新它. #### 将Books页面添加到主菜单 @@ -337,17 +365,16 @@ context.Menu.AddItem( #### 本地化菜单 -本地化的文本在`Acme.BookStore.Domain`项目的`Localization/BookStore`文件夹中. +本地化文本位于`Acme.BookStore.Domain.Shared`项目的`Localization/BookStore`文件夹下: -![bookstore-localization-files](images/bookstore-localization-files.png) +![bookstore-localization-files](images/bookstore-localization-files-v2.png) -打开`en.json`文件,为`Menu:BookStore` 和 `Menu:Books`添加本地化文本: +打开`en.json`文件,将`Menu:BookStore`和`Menu:Books`键的本地化文本添加到文件末尾: ````json { "culture": "en", "texts": { - //... "Menu:BookStore": "Book Store", "Menu:Books": "Books" } @@ -355,9 +382,9 @@ context.Menu.AddItem( ```` * ABP的本地化功能建立在[ASP.NET Core's standard localization]((https://docs.microsoft.com/en-us/aspnet/core/fundamentals/localization))之上并增加了一些扩展.查看[本地化文档](../../Localization.md). -* 本地化中key的名字是随便定义的,你可以随意命名.我们喜欢为菜单添加`Menu`命名空间,以区别于其他的文本.如果文本没有在本地化文件中定义,就会 **返回** 本地的化的key(ASP.NET Core的标准做法). +* 本地化key是任意的. 你可以设置任何名称. 我们更喜欢为菜单项添加`Menu:`前缀以区别于其他文本. 如果未在本地化文件中定义文本,则它将**返回**到本地化的key(ASP.NET Core的标准行为). -运行程序就会看到菜单已经添加到了顶部: +运行该应用程序,看到新菜单项已添加到顶部栏: ![bookstore-menu-items](images/bookstore-menu-items.png) @@ -365,17 +392,16 @@ context.Menu.AddItem( #### 书籍列表 -我们会在页面上使用JQuery插件[Datatables.net](https://datatables.net/)来展示列表.Datatables可以完全通过AJAX工作,所以它很快而且有良好的用户体验.启动模板中已经配置好了Datatables插件,因此你可以在你的页面中直接使用,不需要引用样式和脚本文件. +我们将使用[Datatables.net](https://datatables.net/)JQuery插件来显示页面上的表格列表. 数据表可以完全通过AJAX工作,速度快,并提供良好的用户体验. Datatables插件在启动模板中配置,因此你可以直接在任何页面中使用它,而需要在页面中引用样式和脚本文件. -##### 修改Index.cshtml +##### Index.cshtml 将`Pages/Books/Index.cshtml`改成下面的样子: ````html @page -@using Acme.BookStore.Pages.Books -@inherits Acme.BookStore.Pages.BookStorePageBase -@model IndexModel +@inherits Acme.BookStore.Web.Pages.BookStorePageBase +@model Acme.BookStore.Web.Pages.Books.IndexModel @section scripts { @@ -408,7 +434,7 @@ context.Menu.AddItem( 在`Pages/Books/`文件夹中创建 `index.js`文件 -![bookstore-index-js-file](images/bookstore-index-js-file.png) +![bookstore-index-js-file](images/bookstore-index-js-file-v2.png) `index.js`的内容如下: @@ -430,7 +456,7 @@ $(function () { * `abp.libs.datatables.createAjax`是帮助ABP的动态JavaScript API代理跟Datatable的格式相适应的辅助方法. * `abp.libs.datatables.normalizeConfiguration`是另一个辅助方法.不是必须的, 但是它通过为缺少的选项提供常规值来简化数据表配置. * `acme.bookStore.book.getList`是获取书籍列表的方法(上面已经介绍过了) -* 查看 [Datatable's 文档](https://datatables.net/manual/) 了解更多配置项. +* 查看 [Datatable文档](https://datatables.net/manual/) 了解更多配置项. 最终的页面如下: diff --git a/docs/zh-Hans/Tutorials/AspNetCore-Mvc/Part-II.md b/docs/zh-Hans/Tutorials/AspNetCore-Mvc/Part-II.md index 9e54ac7a2f..d462851f71 100644 --- a/docs/zh-Hans/Tutorials/AspNetCore-Mvc/Part-II.md +++ b/docs/zh-Hans/Tutorials/AspNetCore-Mvc/Part-II.md @@ -2,13 +2,13 @@ ### 关于本教程 -这是本教程所有章节中的第二章.下面是所有的章节: +这是ASP.NET Core MVC教程系列的第二章. 查看其它章节 * [Part I: 创建项目和书籍列表页面](Part-I.md) * **Part II: 创建,编辑,删除书籍(本章)** * [Part III: 集成测试](Part-III.md) -你可以从 [这里](https://github.com/volosoft/abp/tree/master/samples/BookStore) 下载本程序的**源码**. +你可以从[GitHub存储库](https://github.com/volosoft/abp/tree/master/samples/BookStore)访问应用程序的**源代码**. ### 新增 Book 实体 @@ -20,7 +20,7 @@ 在 `Acme.BookStore.Web` 项目的 `Pages/Books` 目录下新建一个 `CreateModal.cshtml` Razor页面: -![bookstore-add-create-dialog](images/bookstore-add-create-dialog.png) +![bookstore-add-create-dialog](images/bookstore-add-create-dialog-v2.png) ##### CreateModal.cshtml.cs @@ -30,7 +30,7 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; -namespace Acme.BookStore.Pages.Books +namespace Acme.BookStore.Web.Pages.Books { public class CreateModalModel : BookStorePageModelBase { @@ -63,9 +63,9 @@ namespace Acme.BookStore.Pages.Books ````html @page -@inherits Acme.BookStore.Pages.BookStorePageBase +@inherits Acme.BookStore.Web.Pages.BookStorePageBase @using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Modal -@model Acme.BookStore.Pages.Books.CreateModalModel +@model Acme.BookStore.Web.Pages.Books.CreateModalModel @{ Layout = null; } @@ -138,12 +138,12 @@ $('#NewBookButton').click(function (e) { 展开 `EditModal.cshtml`,打开 `EditModal.cshtml.cs` 文件( `EditModalModel` 类) 并替换成以下代码: -````C# +````csharp using System; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; -namespace Acme.BookStore.Pages.Books +namespace Acme.BookStore.Web.Pages.Books { public class EditModalModel : BookStorePageModelBase { @@ -180,38 +180,26 @@ namespace Acme.BookStore.Pages.Books * 在 `OnGetAsync` 方法中,将 `BookAppService.GetAsync` 方法返回的 `BookDto` 映射成 `CreateUpdateBookDto` 并赋值给Book属性. * `OnPostAsync` 方法直接使用 `BookAppService.UpdateAsync` 来更新实体. -#### CreateUpdateBookDto +#### BookDto到CreateUpdateBookDto对象映射 -为了执行从 `BookDto` 到 `CreateUpdateBookDto` 的对象映射, 按如下所示修改 `CreateUpdateBookDto`类: +为了执行`BookDto`到`CreateUpdateBookDto`对象映射,请打开`Acme.BookStore.Web`项目中的`BookStoreWebAutoMapperProfile.cs`并更改它,如下所示: -````C# -using System; -using System.ComponentModel.DataAnnotations; -using Volo.Abp.AutoMapper; +````csharp +using AutoMapper; -namespace Acme.BookStore +namespace Acme.BookStore.Web { - [AutoMapTo(typeof(Book))] - [AutoMapFrom(typeof(BookDto))] - public class CreateUpdateBookDto + public class BookStoreWebAutoMapperProfile : Profile { - [Required] - [StringLength(128)] - public string Name { get; set; } - - [Required] - public BookType Type { get; set; } = BookType.Undefined; - - [Required] - public DateTime PublishDate { get; set; } - - [Required] - public float Price { get; set; } + public BookStoreWebAutoMapperProfile() + { + CreateMap(); + } } } ```` -* 仅添加 `[AutoMapFrom(typeof(BookDto))]` 特性就可以创建上述映射关系. +* 刚刚添加了`CreateMap();`作为映射定义. #### EditModal.cshtml @@ -219,8 +207,8 @@ namespace Acme.BookStore ````html @page -@inherits Acme.BookStore.Pages.BookStorePageBase -@using Acme.BookStore.Pages.Books +@inherits Acme.BookStore.Web.Pages.BookStorePageBase +@using Acme.BookStore.Web.Pages.Books @using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Modal @model EditModalModel @{ @@ -231,7 +219,7 @@ namespace Acme.BookStore - + @@ -240,8 +228,8 @@ namespace Acme.BookStore 这个页面内容和 `CreateModal.cshtml` 非常相似,除了以下几点: -* 此页面包含了一个 `abp-input` 以保存所编辑book实体的 `Id` 属性值. -* 此页面指定的post地址是 `Books/EditModal` ,并用文本 *Update* 作为 modal 标题. +* 它包含`id`属性的`abp-input`, 用于存储编辑书的id(它是隐藏的Input) +* 此页面指定的post地址是`Books/EditModal`, 并用文本 *Update* 作为 modal 标题. #### 为表格添加 "操作(Actions)" 下拉菜单 @@ -420,6 +408,12 @@ $(function () { }); ```` +打开`Acme.BookStore.Domain.Shared`项目中的`en.json`并添加以下行: + +````json +"BookDeletionConfirmationMessage": "Are you sure to delete the book {0}?" +```` + 运行程序并尝试删除一个book实体. ### 下一章 diff --git a/docs/zh-Hans/Tutorials/AspNetCore-Mvc/Part-III.md b/docs/zh-Hans/Tutorials/AspNetCore-Mvc/Part-III.md index 80c28acc91..c31f750832 100644 --- a/docs/zh-Hans/Tutorials/AspNetCore-Mvc/Part-III.md +++ b/docs/zh-Hans/Tutorials/AspNetCore-Mvc/Part-III.md @@ -2,23 +2,21 @@ ### 关于本教程 -这是本教程所有章节中的第三章.下面是所有的章节: +这是ASP.NET Core MVC教程系列的第三章. 查看其它章节 - [Part I: 创建项目和书籍列表页面](Part-I.md) - [Part II: 创建,编辑,删除书籍](Part-II.md) - **Part III: 集成测试(本章)** -你可以从 [这里](https://github.com/volosoft/abp/tree/master/samples/BookStore) 下载本程序的**源码**. +你可以从[GitHub存储库](https://github.com/volosoft/abp/tree/master/samples/BookStore)访问应用程序的**源代码**. ### 解决方案中的测试项目 -本解决方案中有两个测试项目: +解决方案中有多个测试项目: +![bookstore-test-projects-v2](images/bookstore-test-projects-v2.png) -* `Acme.BookStore.Application.Tests` 项目用于单元测试和集成测试.你可以在这个项目中为Application Service方法写测试代码.这个项目使用了 **EF Core SQLite in-memory** 数据库. -* `Acme.BookStore.Web.Tests` 项目用于包含Web层的完整集成测试.所以,你也可以在这里写关于UI页面的测试. - -测试项目使用了以下库: +每个项目用于测试相关的应用程序项目.测试项目使用以下库进行测试: * [xunit](https://xunit.github.io/) 作为主测试框架. * [Shoudly](http://shouldly.readthedocs.io/en/latest/) 作为断言库. @@ -26,79 +24,39 @@ ### 添加测试用数据 -起始模板在 `Acme.BookStore.Application.Tests` 项目中包含了 `BookStoreTestDataBuilder` 类,用于创建一些测试用数据. 相关代码如下所示: - -````C# -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; -using Volo.Abp.Identity; -using Volo.Abp.Threading; - -namespace Acme.BookStore -{ - public class BookStoreTestDataBuilder : ITransientDependency - { - private readonly IIdentityDataSeeder _identityDataSeeder; - - public BookStoreTestDataBuilder(IIdentityDataSeeder identityDataSeeder) - { - _identityDataSeeder = identityDataSeeder; - } - - public void Build() - { - AsyncHelper.RunSync(BuildInternalAsync); - } - - public async Task BuildInternalAsync() - { - await _identityDataSeeder.SeedAsync("1q2w3E*"); - } - } -} -```` - -* 这里直接使用了identity模块实现的 `IIdentityDataSeeder` 接口,创建了一个admin角色和admin用户.你可以在测试代码中使用它们. -* 你可以在 `BuildInternalAsync` 方法中添加你自己的测试数据. - -按下方所示修改 `BookStoreTestDataBuilder` 类: +启动模板包含`Acme.BookStore.TestBase`项目中的`BookStoreTestDataSeedContributor`类,它创建一些数据来运行测试. +更改`BookStoreTestDataSeedContributor`类如下所示: ````C# using System; using System.Threading.Tasks; +using Volo.Abp.Data; using Volo.Abp.DependencyInjection; using Volo.Abp.Domain.Repositories; -using Volo.Abp.Identity; -using Volo.Abp.Threading; +using Volo.Abp.Guids; namespace Acme.BookStore { - public class BookStoreTestDataBuilder : ITransientDependency + public class BookStoreTestDataSeedContributor + : IDataSeedContributor, ITransientDependency { - private readonly IIdentityDataSeeder _identityDataSeeder; private readonly IRepository _bookRepository; + private readonly IGuidGenerator _guidGenerator; - public BookStoreTestDataBuilder( - IIdentityDataSeeder identityDataSeeder, - IRepository bookRepository) + public BookStoreTestDataSeedContributor( + IRepository bookRepository, + IGuidGenerator guidGenerator) { - _identityDataSeeder = identityDataSeeder; _bookRepository = bookRepository; + _guidGenerator = guidGenerator; } - public void Build() + public async Task SeedAsync(DataSeedContext context) { - AsyncHelper.RunSync(BuildInternalAsync); - } - - public async Task BuildInternalAsync() - { - await _identityDataSeeder.SeedAsync("1q2w3E*"); - await _bookRepository.InsertAsync( new Book { - Id = Guid.NewGuid(), + Id = _guidGenerator.Create(), Name = "Test book 1", Type = BookType.Fantastic, PublishDate = new DateTime(2015, 05, 24), @@ -109,7 +67,7 @@ namespace Acme.BookStore await _bookRepository.InsertAsync( new Book { - Id = Guid.NewGuid(), + Id = _guidGenerator.Create(), Name = "Test book 2", Type = BookType.Science, PublishDate = new DateTime(2014, 02, 11), @@ -121,7 +79,8 @@ namespace Acme.BookStore } ```` -* 通过构造函数注入 `IRepository`,在 `BuildInternalAsync` 方法中用它创建两个book实体. +* 注入`IRepository`并在`SeedAsync`中使用它来创建两个书实体作为测试数据. +* 使用`IGuidGenerator`服务创建GUID. 虽然`Guid.NewGuid()`非常适合测试,但`IGuidGenerator`在使用真实数据库时还有其他特别重要的功能(参见[Guid生成文档](../../Guid-Generation.md)了解更多信息). ### 测试 BookAppService @@ -211,6 +170,8 @@ public async Task Should_Not_Create_A_Book_Without_Name() * 由于 `Name` 是空值, ABP 抛出一个 `AbpValidationException` 异常. -### 测试 Web 页面 +打开**测试资源管理器**(测试 -> Windows -> 测试资源管理器)并**执行**所有测试: + +![bookstore-appservice-tests](images/bookstore-appservice-tests.png) -TODO +恭喜, 绿色图标表示测试已成功通过! diff --git a/docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-add-create-dialog-v2.png b/docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-add-create-dialog-v2.png new file mode 100644 index 0000000000000000000000000000000000000000..fcadfd7a826e7f8f489e0ff4f4fa961dfd956c7e GIT binary patch literal 3164 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 diff --git a/docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-add-index-page-v2.png b/docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-add-index-page-v2.png new file mode 100644 index 0000000000000000000000000000000000000000..2606bbab32325a337116782f7194b95fb8120dfe GIT binary patch literal 8081 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 literal 0 HcmV?d00001 diff --git a/docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-index-js-file-v2.png b/docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-index-js-file-v2.png new file mode 100644 index 0000000000000000000000000000000000000000..1ba9a4860010aa781862cd111d6e97c8fa5f0063 GIT binary patch literal 2984 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 diff --git a/docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-test-projects-v2.png b/docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-test-projects-v2.png new file mode 100644 index 0000000000000000000000000000000000000000..8701164d7514d15b27b6f83dfde1536bc38f5c58 GIT binary patch literal 6864 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 literal 0 HcmV?d00001 diff --git a/docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-visual-studio-solution.png b/docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-visual-studio-solution.png deleted file mode 100644 index b47636cd68b8b34478e44ccee1383de06bd5ba03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7369 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 literal 0 HcmV?d00001 diff --git a/docs/zh-Hans/images/bookstore-user-management.png b/docs/zh-Hans/images/bookstore-user-management.png deleted file mode 100644 index bc3c176557bc97715e0dd0f9640a78ec8a485bd0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19157 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 diff --git a/docs/zh-Hans/images/bookstore-visual-studio-solution-v2.png b/docs/zh-Hans/images/bookstore-visual-studio-solution-v2.png deleted file mode 100644 index 48b5881e96d7d55d8ac5a292183c6236a07e9f05..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8946 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 literal 0 HcmV?d00001 diff --git a/docs/zh-Hans/images/bookstore-visual-studio-solution.png b/docs/zh-Hans/images/bookstore-visual-studio-solution.png deleted file mode 100644 index b47636cd68b8b34478e44ccee1383de06bd5ba03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7369 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 loSXFtAwNF(wtRYlzi0RObyDdEz`%o)UZ~3