Browse Source

Update document

pull/3705/head
liangshiwei 6 years ago
parent
commit
7b8fd341c4
  1. 4
      docs/zh-Hans/API/Auto-API-Controllers.md
  2. 2
      docs/zh-Hans/Application-Services.md
  3. 2
      docs/zh-Hans/AspNetCore/Tag-Helpers/Buttons.md
  4. 32
      docs/zh-Hans/Audit-Logging.md
  5. 2
      docs/zh-Hans/Authorization.md
  6. 4
      docs/zh-Hans/Background-Workers.md
  7. 14
      docs/zh-Hans/Blog-Posts/2019-02-22/Post.md
  8. 12
      docs/zh-Hans/Blog-Posts/2019-06-19 v0_18_Release/Post.md
  9. 4
      docs/zh-Hans/Blog-Posts/2019-08-16 v0_19_Release/Post.md
  10. 4
      docs/zh-Hans/Blog-Posts/2019-09-25 v0_21_Release/Post.md
  11. 16
      docs/zh-Hans/Blog-Posts/2020-03-19 v2_3_Release/Post.md
  12. 14
      docs/zh-Hans/CLI.md
  13. 2
      docs/zh-Hans/Customizing-Application-Modules-Overriding-Services.md
  14. 6
      docs/zh-Hans/Entities.md
  15. 14
      docs/zh-Hans/Entity-Framework-Core-Migrations.md
  16. 6
      docs/zh-Hans/Entity-Framework-Core-MySQL.md
  17. 2
      docs/zh-Hans/Entity-Framework-Core-Other-DBMS.md
  18. 4
      docs/zh-Hans/Entity-Framework-Core-PostgreSQL.md
  19. 4
      docs/zh-Hans/Entity-Framework-Core-SQLite.md
  20. 10
      docs/zh-Hans/Entity-Framework-Core.md
  21. 2
      docs/zh-Hans/Getting-Started-AspNetCore-Application.md
  22. 2
      docs/zh-Hans/Getting-Started-AspNetCore-MVC-Template.md
  23. 2
      docs/zh-Hans/Index.md
  24. 12
      docs/zh-Hans/Modules/Docs.md
  25. 8
      docs/zh-Hans/Object-Extensions.md
  26. 4
      docs/zh-Hans/Object-To-Object-Mapping.md
  27. 10
      docs/zh-Hans/Options.md
  28. 24
      docs/zh-Hans/Samples/Microservice-Demo.md
  29. 2
      docs/zh-Hans/Settings.md
  30. 4
      docs/zh-Hans/Startup-Templates/Application.md
  31. 2
      docs/zh-Hans/Startup-Templates/Index.md
  32. 8
      docs/zh-Hans/Tutorials/AspNetCore-Mvc/Part-I.md
  33. 4
      docs/zh-Hans/Tutorials/AspNetCore-Mvc/Part-III.md
  34. 2
      docs/zh-Hans/UI/Angular/Component-Replacement.md
  35. 8
      docs/zh-Hans/UI/Angular/Config-State.md
  36. 2
      docs/zh-Hans/UI/Angular/Content-Strategy.md
  37. 2
      docs/zh-Hans/UI/Angular/Context-Strategy.md
  38. 10
      docs/zh-Hans/UI/Angular/Dom-Insertion-Service.md
  39. 2
      docs/zh-Hans/UI/Angular/Lazy-Load-Service.md
  40. 2
      docs/zh-Hans/UI/Angular/Permission-Management.md
  41. 2
      docs/zh-Hans/UI/AspNetCore/Bundling-Minification.md
  42. 2
      docs/zh-Hans/UI/AspNetCore/Tag-Helpers/Progress-Bars.md
  43. 4
      docs/zh-Hans/Validation.md
  44. 2
      docs/zh-Hans/Virtual-File-System.md

4
docs/zh-Hans/API/Auto-API-Controllers.md

@ -6,7 +6,7 @@ ABP可以按照惯例 **自动** 将你的应用程序服务配置为API控制
## 配置
基本配置很简单. 只需配置`AbpAspNetCoreMvcOptions`并使用`ConventionalControllers.Create`方法,如下所示:
基本配置很简单. 只需配置`AbpAspNetCoreMvcOptions`并使用`ConventionalControllers.Create`方法,如下所示:
````csharp
[DependsOn(BookStoreApplicationModule)]
@ -82,7 +82,7 @@ Configure<AbpAspNetCoreMvcOptions>(options =>
* 删除'**Async**'后缀. 如果方法名称为'GetPhonesAsync',则变为`GetPhones`.
* 删除**HTTP method前缀**. 基于的HTTP method删除`GetList`,`GetAll`,`Get`,`Put`,`Update`,`Delete`,`Remove`,`Create`,`Add`,`Insert`,`Post`和`Patch`前缀, 因此`GetPhones`变为`Phones`, 因为`Get`前缀和GET请求重复.
* 将结果转换为**camelCase**.
* 如果生成的操作名称为**空**,则它不会添加到路径中.否则它会被添加到路由中(例如'/phones').对于`GetAllAsync`方法名称它将为空,因为`GetPhonesAsync`方法名称将为`phone`.
* 如果生成的操作名称为**空**,则它不会添加到路径中.否则它会被添加到路由中(例如'/phones').对于`GetAllAsync`方法名称,它将为空,因为`GetPhonesAsync`方法名称将为`phone`.
* 可以通过设置`UrlActionNameNormalizer`选项来自定义.It's an action delegate that is called for every method.
* 如果有另一个带有'Id'后缀的参数,那么它也会作为最终路线段添加到路线中(例如'/phoneId').

2
docs/zh-Hans/Application-Services.md

@ -380,4 +380,4 @@ public class DistrictKey
### 生命周期
应用服务的生命周期是[transient](Dependency-Injection)的它们会自动注册到依赖注入系统.
应用服务的生命周期是[transient](Dependency-Injection)的,它们会自动注册到依赖注入系统.

2
docs/zh-Hans/AspNetCore/Tag-Helpers/Buttons.md

@ -86,7 +86,7 @@ ABP框架定义了Tag Helper用于简单的创建bootstrap按钮.
### `icon-type`
`icon-type` 是一个可选参数它的默认值是 `FontAwesome`. 你可以创建自己的图标类型提供程序并更改它.
`icon-type` 是一个可选参数.它的默认值是 `FontAwesome`. 你可以创建自己的图标类型提供程序并更改它.
你可以为按钮选择以下图标类型:

32
docs/zh-Hans/Audit-Logging.md

@ -43,12 +43,12 @@ Configure<AbpAuditingOptions>(options =>
* `IsEnabledForGetRequests` (默认值: `false`): HTTP GET请求通常不应该在数据库进行任何更改,审计日志系统不会为GET请求保存审计日志对象. 将此值设置为 `true` 可为GET请求启用审计日志系统.
* `ApplicationName`: 如果有多个应用程序保存审计日志到单一的数据库,使用此属性设置为你的应用程序名称区分不同的应用程序日志.
* `IgnoredTypes`: 审计日志系统忽略的 `Type` 列表. 如果它是实体类型,则不会保存此类型实体的更改. 在序列化操作参数时也使用此列表.
* `EntityHistorySelectors`选择器列表,用于确定是否选择了用于保存实体更改的实体类型. 有关详细信息请参阅下面的部分.
* `EntityHistorySelectors`:选择器列表,用于确定是否选择了用于保存实体更改的实体类型. 有关详细信息请参阅下面的部分.
* `Contributors`: `AuditLogContributor` 实现的列表. 贡献者是扩展审计日志系统的一种方式. 有关详细信息请参阅下面的"审计日志贡献者"部分.
### 实体历史选择器
保存的所有实体的所有变化将需要大量的数据库空间. 出于这个原因**审计日志系统不保存为实体的任何改变,除非你明确地对其进行配置**.
保存的所有实体的所有变化将需要大量的数据库空间. 出于这个原因**审计日志系统不保存为实体的任何改变,除非你明确地对其进行配置**.
要保存的所有实体的所有更改,只需使用 `AddAllEntities()` 扩展方法.
@ -131,7 +131,7 @@ public class HomeController : AbpController
可以为任何类型的类(注册到[依赖注入](Dependency-Injection.md)并从依赖注入解析)启用审计日志,默认情况下仅对控制器和应用程序服务启用.
对于任何需要被审计记录的类或方法都可以使用 `[Audited]` 和`IAuditingEnabled`.此外,您的类可以(直接或固有的)实现 `IAuditingEnabled` 接口以认启用该类的审计日志记录.
对于任何需要被审计记录的类或方法都可以使用 `[Audited]` 和`IAuditingEnabled`.此外,你的类可以(直接或固有的)实现 `IAuditingEnabled` 接口以认启用该类的审计日志记录.
### 启用/禁用 实体 & 属性
@ -211,8 +211,8 @@ public class MyUser : Entity<Guid>
* **AuditLogInfo**: 具有以下属性:
* `ApplicationName`: 当你保存不同的应用审计日志到同一个数据库,这个属性用来区分应用程序.
* `UserId`当前用户的Id,用户未登录为 `null`.
* `UserName`当前用户的用户名,如果用户已经登录(这里的值不依赖于标识模块/系统进行查找).
* `UserId`:当前用户的Id,用户未登录为 `null`.
* `UserName`:当前用户的用户名,如果用户已经登录(这里的值不依赖于标识模块/系统进行查找).
* `TenantId`: 当前租户的Id,对于多租户应用.
* `TenantName`: 当前租户的名称,对于多租户应用.
* `ExecutionTime`: 审计日志对象创建的时间.
@ -222,28 +222,28 @@ public class MyUser : Entity<Guid>
* `ClientIpAddress`: 客户端/用户设备的IP地址.
* `CorrelationId`: 当前[相关Id](CorrelationId.md). 相关Id用于在单个逻辑操作中关联由不同应用程序(或微服务)写入的审计日志.
* `BrowserInfo`: 当前用户的浏览器名称/版本信息,如果有的话.
* `HttpMethod`: 当前HTTP请求的方法(GET,POST,PUT,DELETE ...等).
* `HttpMethod`: 当前HTTP请求的方法(GET,POST,PUT,DELETE ...等).
* `HttpStatusCode`: HTTP响应状态码.
* `Url`: 请求的URL.
* **AuditLogActionInfo**: 一个 审计日志动作通常是web请求期间控制器动作或[应用服务](Application-Services.md)方法调用. 一个审计日志可以包含多个动作. 动作对象具有以下属性:
* `ServiceName`执行的控制器/服务的名称.
* `MethodName`控制器/服务执行的方法的名称.
* `Parameters`传递给方法的参数的JSON格文本.
* `ServiceName`:执行的控制器/服务的名称.
* `MethodName`:控制器/服务执行的方法的名称.
* `Parameters`:传递给方法的参数的JSON格文本.
* `ExecutionTime`: 执行的时间.
* `ExecutionDuration`: 方法执行时长,以毫秒为单位. 可以用来观察方法的性能.
* **EntityChangeInfo**: 表示一个实体在Web请求中的变更. 审计日志可以包含0个或多个实体的变更. 实体变更具有以下属性:
* `ChangeTime`: 当实体被改变的时间.
* `ChangeType`具有以下字段的枚举: `Created`(0), `Updated`(1)和 `Deleted`(2).
* `ChangeType`:具有以下字段的枚举: `Created`(0), `Updated`(1)和 `Deleted`(2).
* `EntityId`: 更改实体的Id.
* `EntityTenantId`实体所属的租户Id.
* `EntityTenantId`:实体所属的租户Id.
* `EntityTypeFullName`: 实体的类型(类)的完整命名空间名称(例如Book实体的*Acme.BookStore.Book*.
* **EntityPropertyChangeInfo**: 表示一个实体的属性的更改.一个实体的更改信息(上面已说明)可含有具有以下属性的一个或多个属性的更改:
* `NewValue`: 属性的新值. 如果实体已被删除为 `null`.
* `OriginalValue`变更前旧/初始值. 如果实体是新创建为 `null`.
* `OriginalValue`:变更前旧/初始值. 如果实体是新创建为 `null`.
* `PropertyName`: 实体类的属性名称.
* `PropertyTypeFullName`属性类型的完整命名空间名称.
* `PropertyTypeFullName`:属性类型的完整命名空间名称.
* **Exception**: 审计日志对象可能包含零个或多个异常. 可以得到失败请求的异常信息.
* **Comment**用于将自定义消息添加到审计日志条目的任意字符串值. 审计日志对象可能包含零个或多个注释.
* **Comment**:用于将自定义消息添加到审计日志条目的任意字符串值. 审计日志对象可能包含零个或多个注释.
除了上面说明的标准属性之外,`AuditLogInfo`, `AuditLogActionInfo``EntityChangeInfo` 对象还实现了`IHasExtraProperties` 接口,你可以向这些对象添加自定义属性.
@ -331,7 +331,7 @@ public class MyService : ITransientDependency
### 手动创建审计日志范围
你很少需要手动创建审计日志的范围,但如果你需要,可以使用 `IAuditingManager` 创建审计日志的范围.
:
````csharp
public class MyService : ITransientDependency
@ -366,7 +366,7 @@ public class MyService : ITransientDependency
}
````
可以调用其他服务,它们可能调用其他服务,它们可能更改实体,等等. 所有这些交互都保存为finally块中的一个审计日志对象.
可以调用其他服务,它们可能调用其他服务,它们可能更改实体,等等. 所有这些交互都保存为finally块中的一个审计日志对象.
## 审计日志模块

2
docs/zh-Hans/Authorization.md

@ -153,7 +153,7 @@ myGroup.AddPermission(
myGroup.AddPermission("Author_Management", isEnabled: false);
````
通常你不需要定义禁用权限(除非暂时想要禁用应用程序的功能). 无论怎样,你可能想要禁用依赖模块中定义的权限,这样你可以禁用相关的功能. 参阅下面的 "*更改依赖模块的权限定义*" 节,查看示例用法.
通常你不需要定义禁用权限(除非暂时想要禁用应用程序的功能). 无论怎样,你可能想要禁用依赖模块中定义的权限,这样你可以禁用相关的功能. 参阅下面的 "*更改依赖模块的权限定义*" 节,查看示例用法.
> 注意:检查一个未定义的权限会抛出异常,而被禁用的权限的返回禁止(false).

4
docs/zh-Hans/Background-Workers.md

@ -2,7 +2,7 @@
## 介绍
背景工人在应用简单独立的线程在后台运行。一般来说,他们定期运行,以执行一些任务。例子;
背景工人在应用简单独立的线程在后台运行.一般来说,他们定期运行,以执行一些任务.例子;
后台工作者在应用程序后台运行的简单的独立线程,一般来说它们定期运行执行一些任务.例如;
* 后台工作者可以定期**删除过时的日志**.
@ -72,7 +72,7 @@ public class PassiveUserCheckerWorker : AsyncPeriodicBackgroundWorkerBase
}
````
* `AsyncPeriodicBackgroundWorkerBase` 使用 `AbpTimer`(线程安全定时器)对象来确定**时间段**. 我们可以在构造函数中设置了`Period` 属性
* `AsyncPeriodicBackgroundWorkerBase` 使用 `AbpTimer`(线程安全定时器)对象来确定**时间段**. 我们可以在构造函数中设置了`Period` 属性.
* 它需要实现 `DoWorkAsync` 方法**执行**定期任务.
* 最好使用 `PeriodicBackgroundWorkerContext` **解析依赖** 而不是构造函数. 因为 `AsyncPeriodicBackgroundWorkerBase` 使用 `IServiceScope` 在你的任务执行结束时会对其 **disposed**.
* `AsyncPeriodicBackgroundWorkerBase` **捕获并记录**`DoWorkAsync` 方法抛出的 **异常**.

14
docs/zh-Hans/Blog-Posts/2019-02-22/Post.md

@ -13,7 +13,7 @@ ABP框架的主要目标之一是提供[创建微服务解决方案的便利基
- 使用[Ocelot](https://github.com/ThreeMammals/Ocelot)库开发了多个**网关** / BFF(后端为前端(Backend for Frontends)).
- 使用[IdentityServer](https://identityserver.io/)框架开发**身份验证服务**.它也是一个带有必要UI的SSO(单点登录)应用程序.
- 有**多个数据库**.一些微服务有自己的数据库,而一些服务/应用程序共享一个数据库(以演示不同的用例).
- 具有不同类型的数据库**SQL Server**(使用**Entity Framework Core** ORM)和**MongoDB**.
- 具有不同类型的数据库:**SQL Server**(使用**Entity Framework Core** ORM)和**MongoDB**.
- 有一个**控制台应用程序**来显示通过身份验证使用服务的最简单方法.
- 使用[Redis](https://redis.io/)进行**分布式缓存**.
- 使用[RabbitMQ](https://www.rabbitmq.com/)进行服务到服务(service-to-service)的**消息传递**.
@ -28,27 +28,27 @@ ABP框架的主要目标之一是提供[创建微服务解决方案的便利基
## 路线图
在第一个稳定版本(v1.0)之前还有很多工作要做.可以在GitHub仓库上看到[优先的积压项目](https://github.com/abpframework/abp/issues?q=is%3Aopen+is%3Aissue+milestone%3ABacklog).
在第一个稳定版本(v1.0)之前还有很多工作要做.可以在GitHub仓库上看到[优先的积压项目](https://github.com/abpframework/abp/issues?q=is%3Aopen+is%3Aissue+milestone%3ABacklog).
根据我们的估计,我们计划在2019年第二季度(可能在五月或六月)发布v1.0.所以,不用等待太长时间了.我们也对第一个稳定版本感到非常兴奋.
我们还将完善[文档](https://abp.io/documents/abp/latest),因为它现在还远未完成.
第一个版本可能不包含SPA模板.但是,如果可能的话,我们想要准备一个简单些的.SPA框架还没有确定下来.备选有:**Angular,React和Blazor**.请将的想法写为对此帖的评论.
第一个版本可能不包含SPA模板.但是,如果可能的话,我们想要准备一个简单些的.SPA框架还没有确定下来.备选有:**Angular,React和Blazor**.请将的想法写为对此帖的评论.
## 中文网
中国有一个大型的ABP社区.他们创建了一个中文版的abp.io网站https://abp.io/. 他们一直在保持更新.感谢中国的开发人员,特别是[Liming Ma](https://github.com/maliming).
中国有一个大型的ABP社区.他们创建了一个中文版的abp.io网站:https://abp.io/. 他们一直在保持更新.感谢中国的开发人员,特别是[Liming Ma](https://github.com/maliming).
## NDC {London} 2019
很高兴作为合作伙伴参加[NDC {London}](https://ndc-london.com/)2019 .我们已经与许多开发人员讨论过当前的ASP.NET Boilerplate和ABP vNext,我们得到了很好的反馈.
我们还有机会与[Scott Hanselman](https://twitter.com/shanselman)和[Jon Galloway](https://twitter.com/jongalloway)交谈.他们参观了我们的展位,我们谈到了ABP vNext的想法.他们喜欢新的ABP框架的功能,方法和目标.在twitter上查看一些照片和评论
我们还有机会与[Scott Hanselman](https://twitter.com/shanselman)和[Jon Galloway](https://twitter.com/jongalloway)交谈.他们参观了我们的展位,我们谈到了ABP vNext的想法.他们喜欢新的ABP框架的功能,方法和目标.在twitter上查看一些照片和评论:
![scott-and-jon](scott-and-jon.png)
## 跟上步伐
* 您可以标星并关注**GitHub**存储库:https://github.com/abpframework/abp
* 您可以关注官方**Twitter**帐户获取新闻:https://twitter.com/abpframework
* 你可以标星并关注**GitHub**存储库:https://github.com/abpframework/abp
* 你可以关注官方**Twitter**帐户获取新闻:https://twitter.com/abpframework

12
docs/zh-Hans/Blog-Posts/2019-06-19 v0_18_Release/Post.md

@ -4,7 +4,7 @@ ABP v0.18已发布, 包含解决的[80+个issue](https://github.com/abpframework
## 网站更改
[abp.io](https://abp.io)网站**完全更新**以突出ABP框架的目标和重要功能.文档和博客网址也会更改
[abp.io](https://abp.io)网站**完全更新**以突出ABP框架的目标和重要功能.文档和博客网址也会更改:
- `abp.io/documents`移至[docs.abp.io](https://docs.abp.io).
- `abp.io/blog`转移到[blog.abp.io](https://blog.abp.io).
@ -21,25 +21,25 @@ ABP CLI现在是创建新项目的首选方式,你仍然可以从[开始](https:
### 用法
使用命令行窗口安装ABP CLI
使用命令行窗口安装ABP CLI:
```` bash
dotnet tool install -g Volo.Abp.Cli
````
创建一个新应用程序
创建一个新应用程序:
```` bash
abp new Acme.BookStore
````
将模块添加到应用程序
将模块添加到应用程序:
```` bash
abp add-module Volo.Blogging
````
更新解决方案中所有与ABP相关的包
更新解决方案中所有与ABP相关的包:
```` bash
abp update
@ -59,7 +59,7 @@ abp update
## 更改日志
以下是此版本附带的一些其他功能和增强功能
以下是此版本附带的一些其他功能和增强功能:
* 新[Volo.Abp.Dapper](https://www.nuget.org/packages/Volo.Abp.Dapper)包.
* 新[Volo.Abp.Specifications](https://www.nuget.org/packages/Volo.Abp.Specifications)包.

4
docs/zh-Hans/Blog-Posts/2019-08-16 v0_19_Release/Post.md

@ -14,12 +14,12 @@ ABP v0.19已发布,包含解决的[~90个问题](https://github.com/abpframework
* 更新了[ABP CLI](https://docs.abp.io/en/abp/latest/CLI)和[下载页面](https://abp.io/get-started),以便能够使用新的UI选项生成项目.
* 创建了[教程](https://docs.abp.io/en/abp/latest/Tutorials/Angular/Part-I)以使用新的UI选项快速入门.
我们基于最新的Angular工具和趋势创建了模板,文档和基础架构
我们基于最新的Angular工具和趋势创建了模板,文档和基础架构:
* 使用[NgBootstrap](https://ng-bootstrap.github.io/)和[PrimeNG](https://www.primefaces.org/primeng/)作为UI组件库.你可以使用自己喜欢的库,没问题,但预构建的模块可以使用这些库.
* 使用[NGXS](https://ngxs.gitbook.io/ngxs/)作为状态管理库.
Angular是第一个SPA UI选项,但它不是最后一个.在v1.0发布之后,我们将开始第二个UI选项的工作.虽然尚未决定,但候选的有Blazor,React和Vue.js. 等待你的反馈.你可以使用以下issue进行投票(thumb)
Angular是第一个SPA UI选项,但它不是最后一个.在v1.0发布之后,我们将开始第二个UI选项的工作.虽然尚未决定,但候选的有Blazor,React和Vue.js. 等待你的反馈.你可以使用以下issue进行投票(thumb):
* [Blazor](https://github.com/abpframework/abp/issues/394)
* [Vue.js](https://github.com/abpframework/abp/issues/1168)

4
docs/zh-Hans/Blog-Posts/2019-09-25 v0_21_Release/Post.md

@ -14,8 +14,8 @@ ABP框架越来越接近v1.0.我们打算在今年10月中旬发布1.0. 现在,
## Techorama荷兰2019
[Techorama NL](https://techorama.nl/)是欧洲最大的会议之一.今年,Volosoft是会议的赞助商,并将有一个展位与软件开发人员讨论ABP框架和软件开发.我们的展位墙如下图所示
[Techorama NL](https://techorama.nl/)是欧洲最大的会议之一.今年,Volosoft是会议的赞助商,并将有一个展位与软件开发人员讨论ABP框架和软件开发.我们的展位墙如下图所示:
![volosoft-booth](volosoft-booth.png)
如果您也参加会议,请到展位讨论ABP框架.我们还为您准备了一些私货:)
如果你也参加会议,请到展位讨论ABP框架.我们还为你准备了一些私货:)

16
docs/zh-Hans/Blog-Posts/2020-03-19 v2_3_Release/Post.md

@ -24,7 +24,7 @@
我们终于完成了**react native移动应用程序**.目前,它可以让你**登录**,管理**用户**和**租户**.它利用ABP框架相同的设置,授权和本地化系统.
应用程序的一些截图
应用程序的一些截图:
![mobile-ui](react-native-ui.png)
@ -34,7 +34,7 @@
从我们的Angular应用程序中调用服务器中的REST端点是很常见的.这种情况下,我们一般创建**服务**(在服务器上包含各个服务的方法)和**模型对象**(对应服务器上的[DTO](https://docs.abp.io/en/abp/latest/Data-Transfer-Objects)).
除了手动创建这样的与服务器交互的服务外,我们可以使用像[NSWAG](https://github.com/RicoSuter/NSwag)工具来为我们生成服务代理.但是NSWAG有以下几个我们遇到的问题
除了手动创建这样的与服务器交互的服务外,我们可以使用像[NSWAG](https://github.com/RicoSuter/NSwag)工具来为我们生成服务代理.但是NSWAG有以下几个我们遇到的问题:
* 它产生一个**大,单一**的.ts文件;
* 当你的应用程序增长时,它变得**太大**了.
@ -58,12 +58,12 @@ abp generate-proxy
### 添加模块的源代码
应用程序启动模板带有一些[应用模块](https://docs.abp.io/en/abp/latest/Modules/Index), 以**Nuget和NPM包**的方式**预先安装了** .这样做有几个重要的优点
应用程序启动模板带有一些[应用模块](https://docs.abp.io/en/abp/latest/Modules/Index), 以**Nuget和NPM包**的方式**预先安装了** .这样做有几个重要的优点:
* 当新版本可用时, 你可以 **轻松地[升级](https://docs.abp.io/en/abp/latest/CLI#update)** 这些模块.
* 你的解决方案**更干净**,这样你就可以专注于自己的代码.
但是,当你需要对一个依赖的模块**大量定制**时,就不如它的代码在你的应用程序中那么容易.为了解决这个问题,我们引入了一个[ABP CLI](https://docs.abp.io/en/abp/latest/CLI)的新命令, 在你的解决方案中用代码**替换**Nuget包.用法很简单
但是,当你需要对一个依赖的模块**大量定制**时,就不如它的代码在你的应用程序中那么容易.为了解决这个问题,我们引入了一个[ABP CLI](https://docs.abp.io/en/abp/latest/CLI)的新命令, 在你的解决方案中用代码**替换**Nuget包.用法很简单:
````bash
abp add-module --with-source-code
@ -75,19 +75,19 @@ abp add-module --with-source-code
此外,我们也创建了文档来说明如何定制依赖的模块而不改变它们的源代码(见下面的部分).仍然建议以包的方式使用模块,以便在以后可以轻松升级.
> 免费模块的源代码是**MIT**许可,所以你可以自由更改它们并添加到的解决方案中.
> 免费模块的源代码是**MIT**许可,所以你可以自由更改它们并添加到的解决方案中.
### 切换到预览版
ABP框架正在迅速发展,我们经常发布新版本.不过,如果你想更紧密地追随它,你可以使用**每日预览包**.
我们创建了一个ABP CLI命令来轻松地为你的解决方案**更新到最新的预览包**.在你的解决方案的根文件夹中运行以下命令
我们创建了一个ABP CLI命令来轻松地为你的解决方案**更新到最新的预览包**.在你的解决方案的根文件夹中运行以下命令:
````bash
abp switch-to-preview
````
它会修改所有ABP相关的NuGet和NPM包的版本.当你需要时你也可以**切换回最新稳定版**
它会修改所有ABP相关的NuGet和NPM包的版本.当你需要时你也可以**切换回最新稳定版**:
````bash
abp switch-to-stable
@ -131,7 +131,7 @@ abp switch-to-stable
## 下一步?
我们未来几个月的目标如下
我们未来几个月的目标如下:
* 完成**文档和示例**,写更多的教程.
* 使框架和现有模块的更加**可定制和可扩展**.

14
docs/zh-Hans/CLI.md

@ -41,12 +41,12 @@ abp new Acme.BookStore
* `--template` 或者 `-t`: 指定模板. 默认的模板是 `app`,会生成web项目.可用的模板有:
* `app` (default): [应用程序模板](Startup-Templates/Application.md). 其他选项:
* `--ui` 或者 `-u`: 指定ui框架.默认`mvc`框架.其他选项
* `mvc`: ASP.NET Core MVC.此模板的其他选项
* `--ui` 或者 `-u`: 指定ui框架.默认`mvc`框架.其他选项:
* `mvc`: ASP.NET Core MVC.此模板的其他选项:
* `--tiered`: 创建分层解决方案,Web和Http Api层在物理上是分开的.如果未指定会创建一个分层的解决方案,此解决方案没有那么复杂,适合大多数场景.
* `angular`: Angular. 这个模板还有一些额外的选项
* `angular`: Angular. 这个模板还有一些额外的选项:
* `--separate-identity-server`: 将Identity Server应用程序与API host应用程序分开. 如果未指定,则服务器端将只有一个端点.
* `none`: 无UI. 这个模板还有一些额外的选项
* `none`: 无UI. 这个模板还有一些额外的选项:
* `--separate-identity-server`: 将Identity Server应用程序与API host应用程序分开. 如果未指定,则服务器端将只有一个端点.
* `--mobile` 或者 `-m`: 指定移动应用程序框架. 默认框架是 `react-native`. 其他选项:
* `none`: 不包含移动应用程序.
@ -57,7 +57,7 @@ abp new Acme.BookStore
* `module`: [Module template](Startup-Templates/Module.md). 其他选项:
* `--no-ui`: 不包含UI.仅创建服务模块(也称为微服务 - 没有UI).
* `--output-folder` 或者 `-o`: 指定输出文件夹,默认是当前目录.
* `--version` 或者 `-v`: 指定ABP和模板的版本.它可以是 [release tag](https://github.com/abpframework/abp/releases) 或者 [branch name](https://github.com/abpframework/abp/branches). 如果没有指定,则使用最新版本.大多数情况下,会希望使用最新的版本.
* `--version` 或者 `-v`: 指定ABP和模板的版本.它可以是 [release tag](https://github.com/abpframework/abp/releases) 或者 [branch name](https://github.com/abpframework/abp/branches). 如果没有指定,则使用最新版本.大多数情况下,会希望使用最新的版本.
* `--template-source` 或者 `-ts`: 指定自定义模板源用于生成项目,可以使用本地源和网络源(例如 `D\localTemplate``https://<your url>.zip`).
* `--create-solution-folder` 或者 `-csf`: 指定项目是在输出文件夹中的新文件夹中还是直接在输出文件夹中.
* `--connection-string` 或者 `-cs`: 重写所有 `appsettings.json` 文件的默认连接字符串. 默认连接字符串是 `Server=localhost;Database=MyProjectName;Trusted_Connection=True;MultipleActiveResultSets=true`. 如果你不想使用默认,你可以设置自己的连接字符串. 默认的数据库提供程序是 `SQL Server`, 所以你只能输入SQL Server连接字符串!
@ -186,9 +186,9 @@ abp generate-proxy [options]
#### Options
* `--apiUrl` 或者 `-a`指定HTTP API的根URL. 如果未指定这个选项,默认使用你Angular应用程序的`environment.ts`文件API URL. 在运行 `generate-proxy` 命令之前,你的host必须启动正在运行.
* `--apiUrl` 或者 `-a`:指定HTTP API的根URL. 如果未指定这个选项,默认使用你Angular应用程序的`environment.ts`文件API URL. 在运行 `generate-proxy` 命令之前,你的host必须启动正在运行.
* `--ui` 或者 `-u`: 指定UI框架,默认框架是angular.当前只有angular一个选项, 但我们会通过更改CLI增加新的选项. 尽请关注!
* `--module` 或者 `-m`指定模块名. 默认模块名称为app. 如果你想所有模块,你可以指定 `--module all` 命令.
* `--module` 或者 `-m`:指定模块名. 默认模块名称为app. 如果你想所有模块,你可以指定 `--module all` 命令.
示例:

2
docs/zh-Hans/Customizing-Application-Modules-Overriding-Services.md

@ -54,7 +54,7 @@ context.Services.Replace(
## 重写一个服务类
大多数情况下,你会仅想改变服务当前实现的一个或几个方法. 重新实现完整的接口变的繁琐,更好的方法是继承原始类并重写方法
大多数情况下,你会仅想改变服务当前实现的一个或几个方法. 重新实现完整的接口变的繁琐,更好的方法是继承原始类并重写方法.
### 示例: 重写服务方法

6
docs/zh-Hans/Entities.md

@ -72,7 +72,7 @@ public class BookAppService : ApplicationService, IBookAppService
* `BookAppService` 注入图书实体的默认[仓库](Repositories.md),使用`InsertAsync`方法插入 `Book` 到数据库中.
* `GuidGenerator`类型是 `IGuidGenerator`,它是在`ApplicationService`基类中定义的属性. ABP将这样常用属性预注入,所以不需要手动[注入](Dependency-Injection.md).
* 如果您想遵循DDD最佳实践,请参阅下面的*聚合示例*部分.
* 如果你想遵循DDD最佳实践,请参阅下面的*聚合示例*部分.
### 具有复合键的实体
@ -228,7 +228,7 @@ ABP框架不强制你应用任何DDD规则或模式.但是,当你准备应用的
## 基类和接口的审计属性
有一些属性,像`CreationTime`,`CreatorId`,`LastModificationTime`...在所有应用中都很常见. ABP框架提供了一些接口和基类来**标准化**这些属性,并**自动设置它们的值**.
有一些属性,像`CreationTime`,`CreatorId`,`LastModificationTime`...在所有应用中都很常见. ABP框架提供了一些接口和基类来**标准化**这些属性,并**自动设置它们的值**.
### 审计接口
@ -285,7 +285,7 @@ ABP框架不强制你应用任何DDD规则或模式.但是,当你准备应用的
所有这些基类都有非泛型版本,可以使用 `AuditedEntity``FullAuditedAggregateRoot` 来支持复合主键;
所有这些基类也有 `... WithUser``FullAuditedAggregateRootWithUser<TUser>``FullAuditedAggregateRootWithUser<TKey, TUser>`. 这样就可以将导航属性添加到你的用户实体. 但在聚合根之间添加导航属性不是一个好做法,所以这种用法是不建议的(除非你使用EF Core之类的ORM可以很好地支持这种情况,并且你真的需要它. 请记住这种方法不适用于NoSQL数据库(如MongoDB),你必须真正实现聚合模式).
所有这些基类也有 `... WithUser`,`FullAuditedAggregateRootWithUser<TUser>``FullAuditedAggregateRootWithUser<TKey, TUser>`. 这样就可以将导航属性添加到你的用户实体. 但在聚合根之间添加导航属性不是一个好做法,所以这种用法是不建议的(除非你使用EF Core之类的ORM可以很好地支持这种情况,并且你真的需要它. 请记住这种方法不适用于NoSQL数据库(如MongoDB),你必须真正实现聚合模式).
## 额外的属性

14
docs/zh-Hans/Entity-Framework-Core-Migrations.md

@ -1,7 +1,7 @@

# EF Core数据库迁移
本文首先介绍[应用程序启动模板](Startup-Templates/Application.md)提供的**默认结构**,并讨论可能希望为自己的应用程序实现的**各种场景**.
本文首先介绍[应用程序启动模板](Startup-Templates/Application.md)提供的**默认结构**,并讨论可能希望为自己的应用程序实现的**各种场景**.
> 本文档适用于希望完全理解和自定义[应用程序启动模板](Startup-Templates/Application.md)附带的数据库结构的人员. 如果你只是想创建实体和管理代码优先(code first)迁移,只需要遵循[启动教程](Tutorials/Index.md).
@ -95,7 +95,7 @@ Volo.Abp.IdentityServer.AbpIdentityServerDbProperties.DbTablePrefix = "Ids";
这个项目有应用程序的 `DbContext`类(本例中的 `BookStoreDbContex` ).
**每个模块都使用自己的 `DbContext` 类**来访问数据库同样你的应用程序有它自己的 `DbContext`. 通常在应用程序中使用这个 `DbContet`(如果你遵循最佳实践,应该在[仓储](Repositories.md)中使用). 它几乎是一个空的 `DbContext`,因为你的应用程序在一开始没有任何实体,除了预定义的 `AppUser` 实体:
**每个模块都使用自己的 `DbContext` 类**来访问数据库.同样你的应用程序有它自己的 `DbContext`. 通常在应用程序中使用这个 `DbContet`(如果你遵循最佳实践,应该在[仓储](Repositories.md)中使用). 它几乎是一个空的 `DbContext`,因为你的应用程序在一开始没有任何实体,除了预定义的 `AppUser` 实体:
````csharp
[ConnectionStringName("Default")]
@ -268,10 +268,10 @@ public class BackgroundJobsDbContext
##### 重用模块的表
可能想在应用程序中**重用依赖模块的表**. 在这种情况下你有两个选择:
可能想在应用程序中**重用依赖模块的表**. 在这种情况下你有两个选择:
1. 你可以**直接使用模块定义的实体**(你仍然可以在某种程度上[扩展实体](Customizing-Application-Modules-Extending-Entities.md)).
2. 你可以**创建一个新的实体**映射到同一个数据库表
2. 你可以**创建一个新的实体**映射到同一个数据库表.
###### 使用由模块定义的实体
@ -307,7 +307,7 @@ namespace Acme.BookStore
示例注入了 `IRepository<IdentityUser,Guid>`(默认仓储). 它定义了标准的存储库方法并实现了 `IQueryable` 接口.
另外身份模块定义了 `IIdentityUserRepository`(自定义仓储),你的应用程序也可以注入和使用它. `IIdentityUserRepository``IdentityUser` 实体提供了额外的定制方法,但它没有实现 `IQueryable`.
另外,身份模块定义了 `IIdentityUserRepository`(自定义仓储),你的应用程序也可以注入和使用它. `IIdentityUserRepository``IdentityUser` 实体提供了额外的定制方法,但它没有实现 `IQueryable`.
###### 创建一个新的实体
@ -352,7 +352,7 @@ namespace Acme.BookStore.Roles
* 它继承了[`AggregateRoot<Guid>`类](Entities.md)和实现了[`IMultiTenant`]接口(Multi-Tenancy.md),因为 `IdentityRole` 也做了同样的继承.
* 你可以添加 `IdentityRole` 实体定义的任何属性. 本例只加了 `TenantId``Name` 属性,因为我们这里只需要它们. 你可以把setters设置为私有(如同本例)以防意外更改身份模块的属性.
* 你可以添加自定义(附加)属性. 本例添加了 `Title` 属性.
* **构造函数是私有的**,所以它不允许直接创建一个新的 `AppRole` 实体创建角色身份模块的责任. 你可以查询角色,设置/更新自定义属性,但做为最佳实践你不应该在代码中创建和删除角色(尽管没有强制的限制).
* **构造函数是私有的**,所以它不允许直接创建一个新的 `AppRole` 实体.创建角色身份模块的责任. 你可以查询角色,设置/更新自定义属性,但做为最佳实践你不应该在代码中创建和删除角色(尽管没有强制的限制).
现在是时候定义EF Core映射. 打开应用程序的 `DbContext` (此示例中是 `BookStoreDbContext` )添加以下属性:
@ -360,7 +360,7 @@ namespace Acme.BookStore.Roles
public DbSet<AppRole> Roles { get; set; }
````
然后在 `OnModelCreating` 方法中配置映射(调用 `base.OnModelCreating(builder)` 之后)
然后在 `OnModelCreating` 方法中配置映射(调用 `base.OnModelCreating(builder)` 之后):
````csharp
protected override void OnModelCreating(ModelBuilder builder)

6
docs/zh-Hans/Entity-Framework-Core-MySQL.md

@ -12,12 +12,12 @@
## UseMySQL()
查找你的解决方案中 `UseSqlServer()`调用替换为 `UseMySQL()`. 检查下列文件:
查找你的解决方案中 `UseSqlServer()`调用,替换为 `UseMySQL()`. 检查下列文件:
* `.EntityFrameworkCore` 项目中的*YourProjectName*EntityFrameworkCoreModule.cs.
* `.EntityFrameworkCore` 项目中的*YourProjectName*MigrationsDbContextFactory.cs.
> 根据你的解决方案的结构你可能发现更多需要改变代码的文件.
> 根据你的解决方案的结构,你可能发现更多需要改变代码的文件.
## 更改连接字符串
@ -27,7 +27,7 @@ MySQL连接字符串与SQL Server连接字符串不同. 所以检查你的解决
## 更改迁移DbContext
MySQL DBMS与SQL Server有一些细微的差异. 某些模块数据库映射配置(尤其是字段长度)会导致MySQL出现问题. 例如某些[IdentityServer模块](Modules/IdentityServer.md)表就存在这样的问题,它提供了一个选项可以根据的DBMS配置字段.
MySQL DBMS与SQL Server有一些细微的差异. 某些模块数据库映射配置(尤其是字段长度)会导致MySQL出现问题. 例如某些[IdentityServer模块](Modules/IdentityServer.md)表就存在这样的问题,它提供了一个选项可以根据的DBMS配置字段.
启动模板包含*YourProjectName*MigrationsDbContext,它负责维护和迁移数据库架构. 此DbContext基本上调用依赖模块的扩展方法来配置其数据库表.

2
docs/zh-Hans/Entity-Framework-Core-Other-DBMS.md

@ -63,7 +63,7 @@ MySQL连接字符串与SQL Server连接字符串不同. 所以检查你的解决
## 更改迁移DbContext
MySQL DBMS与SQL Server有一些细微的差异. 某些模块数据库映射配置(尤其是字段长度)会导致MySQL出现问题. 例如某些[IdentityServer模块](Modules/IdentityServer.md)表就存在这样的问题,它提供了一个选项可以根据的DBMS配置字段.
MySQL DBMS与SQL Server有一些细微的差异. 某些模块数据库映射配置(尤其是字段长度)会导致MySQL出现问题. 例如某些[IdentityServer模块](Modules/IdentityServer.md)表就存在这样的问题,它提供了一个选项可以根据的DBMS配置字段.
启动模板包含*YourProjectName*MigrationsDbContext,它负责维护和迁移数据库架构. 此DbContext基本上调用依赖模块的扩展方法来配置其数据库表.

4
docs/zh-Hans/Entity-Framework-Core-PostgreSQL.md

@ -12,12 +12,12 @@
## UsePostgreSql()
查找你的解决方案中 `UseSqlServer()`调用替换为 `UsePostgreSql()`. 检查下列文件:
查找你的解决方案中 `UseSqlServer()`调用,替换为 `UsePostgreSql()`. 检查下列文件:
* `.EntityFrameworkCore` 项目中的*YourProjectName*EntityFrameworkCoreModule.cs.
* `.EntityFrameworkCore` 项目中的*YourProjectName*MigrationsDbContextFactory.cs.
> 根据你的解决方案的结构你可能发现更多需要改变代码的文件.
> 根据你的解决方案的结构,你可能发现更多需要改变代码的文件.
## 更改连接字符串

4
docs/zh-Hans/Entity-Framework-Core-SQLite.md

@ -12,12 +12,12 @@
## UseSqlite()
查找你的解决方案中 `UseSqlServer()`调用替换为 `UseSqlite()`. 检查下列文件:
查找你的解决方案中 `UseSqlServer()`调用,替换为 `UseSqlite()`. 检查下列文件:
* `.EntityFrameworkCore` 项目中的*YourProjectName*EntityFrameworkCoreModule.cs.
* `.EntityFrameworkCore` 项目中的*YourProjectName*MigrationsDbContextFactory.cs.
> 根据你的解决方案的结构你可能发现更多需要改变代码的文件.
> 根据你的解决方案的结构,你可能发现更多需要改变代码的文件.
## 更改连接字符串

10
docs/zh-Hans/Entity-Framework-Core.md

@ -108,7 +108,7 @@ protected override void OnModelCreating(ModelBuilder builder)
### 配置连接字符串选择
如果你的应用程序有多个数据库,你可以使用 `connectionStringName]` Attribute为你的DbContext配置连接字符串名称.
:
```csharp
[ConnectionStringName("MySecondConnString")]
@ -274,7 +274,7 @@ public override async Task DeleteAsync(
## 访问 EF Core API
大多数情况下应该隐藏仓储后面的EF Core API(这也是仓储的设计目地). 但是如果想要通过仓储访问DbContext实现,则可以使用`GetDbContext()`或`GetDbSet()`扩展方法. 例
大多数情况下应该隐藏仓储后面的EF Core API(这也是仓储的设计目地). 但是如果想要通过仓储访问DbContext实现,则可以使用`GetDbContext()`或`GetDbSet()`扩展方法. 例:
````csharp
public class BookService
@ -304,7 +304,7 @@ public class BookService
默认,实体的所有额外属性存储在数据库的一个 `JSON` 对象中.
实体扩展系统允许你存储额外属性在数据库的单独字段中. 有关额外属性和实体扩展系统的更多信息,请参阅下列文档
实体扩展系统允许你存储额外属性在数据库的单独字段中. 有关额外属性和实体扩展系统的更多信息,请参阅下列文档:
* [自定义应用模块: 扩展实体](Customizing-Application-Modules-Extending-Entities.md)
* [实体](Entities.md)
@ -313,7 +313,7 @@ public class BookService
### ObjectExtensionManager.Instance
`ObjectExtensionManager` 实现单例模式因此你需要使用静态的 `ObjectExtensionManager.Instance` 来执行所有操作
`ObjectExtensionManager` 实现单例模式,因此你需要使用静态的 `ObjectExtensionManager.Instance` 来执行所有操作.
### MapEfCoreProperty
@ -417,7 +417,7 @@ context.Services.AddAbpDbContext<BookStoreDbContext>(options =>
});
````
现在,的自定义仓储也可以使用`IBookStoreDbContext`接口:
现在,的自定义仓储也可以使用`IBookStoreDbContext`接口:
````csharp
public class BookRepository : EfCoreRepository<IBookStoreDbContext, Book, Guid>, IBookRepository

2
docs/zh-Hans/Getting-Started-AspNetCore-Application.md

@ -156,7 +156,7 @@ services.AddApplication<AppModule>(options =>
});
````
4. 更新 `Program.cs`代码, 不再使用`WebHost.CreateDefaultBuilder()`方法(因为它使用默认的DI容器)
4. 更新 `Program.cs`代码, 不再使用`WebHost.CreateDefaultBuilder()`方法(因为它使用默认的DI容器):
````csharp
public class Program

2
docs/zh-Hans/Getting-Started-AspNetCore-MVC-Template.md

@ -4,7 +4,7 @@
本教程使用 **ABP CLI** 创建一个新项目. 更多选项, 请参阅[入门](https://abp.io/get-started)页面.
如果你之前未安装请使用命令行安装ABP CLI:
如果你之前未安装,请使用命令行安装ABP CLI:
````bash
dotnet tool install -g Volo.Abp.Cli

2
docs/zh-Hans/Index.md

@ -12,7 +12,7 @@ ABP是一个**开源应用程序框架**,专注于基于ASP.NET Core的Web应用
* [ASP.NET Core MVC 模板](Getting-Started-AspNetCore-MVC-Template.md)
如果想从头开始(使用空项目),请手动安装ABP框架并使用以下教程:
如果想从头开始(使用空项目),请手动安装ABP框架并使用以下教程:
* [控制台应用程序](Getting-Started-Console-Application.md)
* [ASP.NET Core Web 应用程序](Getting-Started-AspNetCore-Application.md)

12
docs/zh-Hans/Modules/Docs.md

@ -326,7 +326,7 @@ There are no projects yet!
{"GitHubRootUrl":"https://github.com/abpframework/abp/tree/{version}/docs/zh-Hans/","GitHubAccessToken":"***","GitHubUserAgent":""}
```
注意 `GitHubAccessToken``***` 掩盖. 这是一个私人令牌你必须从GitHub获取它. 请参阅 https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line/
注意 `GitHubAccessToken``***` 掩盖. 这是一个私人令牌,你必须从GitHub获取它. 请参阅 https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line/
- MainWebsiteUrl: `/`
@ -338,7 +338,7 @@ There are no projects yet!
INSERT [dbo].[DocsProjects] ([Id], [Name], [ShortName], [Format], [DefaultDocumentName], [NavigationDocumentName], [MinimumVersion], [DocumentStoreType], [ExtraProperties], [MainWebsiteUrl], [LatestVersionBranchName], [ParametersDocumentName]) VALUES (N'12f21123-e08e-4f15-bedb-ae0b2d939658', N'ABP framework (GitHub)', N'abp', N'md', N'Index', N'docs-nav.json', NULL, N'GitHub', N'{"GitHubRootUrl":"https://github.com/abpframework/abp/tree/{version}/docs","GitHubAccessToken":"***","GitHubUserAgent":""}', N'/', N'master', N'')
```
请注意`GitHubAccessToken` 被屏蔽了.它是一个私人令牌,你必须获得自己的令牌并替换 `***` 字符串.
请注意,`GitHubAccessToken` 被屏蔽了.它是一个私人令牌,你必须获得自己的令牌并替换 `***` 字符串.
现在你可以运行应用程序并导航到 `/Documents`.
@ -378,9 +378,9 @@ INSERT [dbo].[DocsProjects] ([Id], [Name], [ShortName], [Format], [DefaultDocume
INSERT [dbo].[DocsProjects] ([Id], [Name], [ShortName], [Format], [DefaultDocumentName], [NavigationDocumentName], [MinimumVersion], [DocumentStoreType], [ExtraProperties], [MainWebsiteUrl], [LatestVersionBranchName], [ParametersDocumentName]) VALUES (N'12f21123-e08e-4f15-bedb-ae0b2d939659', N'ABP framework (FileSystem)', N'abp', N'md', N'Index', N'docs-nav.json', NULL, N'FileSystem', N'{"Path":"C:\\Github\\abp\\docs"}', N'/', NULL, N'')
```
添加上面的一个示例项目后运行该应用程序. 在菜单中你会看到`文档` 链接点击菜单链接打开文档页面.
添加上面的一个示例项目后运行该应用程序. 在菜单中你会看到`文档` 链接,点击菜单链接打开文档页面.
到目前为止, 我们已经从abp.io网站创建了一个新的应用程序并为Docs模块做好准备.
到目前为止, 我们已经从abp.io网站创建了一个新的应用程序,并为Docs模块做好准备.
### 7- 添加一个新文档
@ -454,7 +454,7 @@ public class Person
}
```
因为并不是项目中的每个文档都有章节或者不需要所有的参数,你必须声明哪些参数将用于对文档进行分段在文档的任何地方都可以使用JSON块.
因为并不是项目中的每个文档都有章节或者不需要所有的参数,你必须声明哪些参数将用于对文档进行分段,在文档的任何地方都可以使用JSON块.
例如 [Getting-Started.md](https://github.com/abpio/abp-commercial-docs/blob/master/en/getting-started.md):
@ -570,7 +570,7 @@ This document assumes that you prefer to use **{{ UI_Value }}** as the UI framew
![Navigation menu](../images/docs-module_download-sample-navigation-menu.png)
最后,为您的项目添加了一个新的Docs模块, 该模块由GitHub提供.
最后,为你的项目添加了一个新的Docs模块, 该模块由GitHub提供.
## 全文搜索(Elastic Search)

8
docs/zh-Hans/Object-Extensions.md

@ -62,7 +62,7 @@ if (user.GetProperty<bool>("IsSuperUser"))
##### 非基本属性类型
如果您的属性类型不是原始类型(int,bool,枚举,字符串等),你需要使用 `GetProperty` 的非泛型版本,它会返回 `object`.
如果你的属性类型不是原始类型(int,bool,枚举,字符串等),你需要使用 `GetProperty` 的非泛型版本,它会返回 `object`.
#### HasProperty
@ -180,7 +180,7 @@ ObjectExtensionManager.Instance
假设你已向可扩展的实体对象添加了额外的属性并使用了自动[对象到对象的映射](Object-To-Object-Mapping.md)将该实体映射到可扩展的DTO类. 在这种情况下你需要格外小心,因为额外属性可能包含**敏感数据**,这些数据对于客户端不可用.
本节提供了一些**好的做法**,可以控制对象映射的额外属性
本节提供了一些**好的做法**,可以控制对象映射的额外属性.
### MapExtraPropertiesTo
@ -232,7 +232,7 @@ identityUser.MapExtraPropertiesTo(
#### AutoMapper集成
如果使用的是[AutoMapper](https://automapper.org/)库,ABP框架还提供了一种扩展方法来利用上面定义的 `MapExtraPropertiesTo` 方法.
如果使用的是[AutoMapper](https://automapper.org/)库,ABP框架还提供了一种扩展方法来利用上面定义的 `MapExtraPropertiesTo` 方法.
你可以在映射配置文件中使用 `MapExtraProperties()` 方法.
@ -247,7 +247,7 @@ public class MyProfile : Profile
}
````
它与 `MapExtraPropertiesTo()` 方法具有相同的参数
它与 `MapExtraPropertiesTo()` 方法具有相同的参数.
## Entity Framework Core 数据库映射

4
docs/zh-Hans/Object-To-Object-Mapping.md

@ -168,7 +168,7 @@ public class MyProfile : Profile
假设你已经创建了一个**可重用的模块**,其中定义了AutoMapper配置文件,并在需要映射对象时使用 `IObjectMapper`. 根据[模块化](Module-Development-Basics.md)的性质,你的模块可以用于不同的应用程序.
`IObjectMapper` 是一个抽象,可以由最终应用程序替换使用另一个映射库. 这里的问题是你的可重用模块设计为使用AutoMapper因为它为其定义映射配置文件. 这种情况下即使最终应用程序使用另一个默认对象映射库,你也要保证模块始终使用AutoMapper.
`IObjectMapper` 是一个抽象,可以由最终应用程序替换使用另一个映射库. 这里的问题是你的可重用模块设计为使用AutoMapper,因为它为其定义映射配置文件. 这种情况下即使最终应用程序使用另一个默认对象映射库,你也要保证模块始终使用AutoMapper.
`IObjectMapper<TContext>`将对象映射器上下文化,你可以为不同的 模块/上下文 使用不同的库.
@ -201,7 +201,7 @@ public class UserAppService : ApplicationService
`UserAppService` 注入 `IObjectMapper<MyModule>`, 它是模块的特定对象映射器,用法与 `IObjectMapper` 完全相同.
上面的示例代码未使用 `ApplicationService` 中定义的 `ObjectMapper` 属性而是注入了 `IObjectMapper<MyModule>`. 但是 `ApplicationService` 定义了可以在类构造函数中设置的 `ObjectMapperContext` 属性, 因此仍然可以使用基类属性. 示例可以进行以下重写:
上面的示例代码未使用 `ApplicationService` 中定义的 `ObjectMapper` 属性,而是注入了 `IObjectMapper<MyModule>`. 但是 `ApplicationService` 定义了可以在类构造函数中设置的 `ObjectMapperContext` 属性, 因此仍然可以使用基类属性. 示例可以进行以下重写:
````csharp
public class UserAppService : ApplicationService

10
docs/zh-Hans/Options.md

@ -9,7 +9,7 @@ ABP框架遵循选项模式,并定义了用于配置框架和模块的选项类(
## 配置选项
通常配置选项在 `Startup` 类的 `ConfigureServices` 方法中. 但由于ABP框架提供了模块化基础设施,因此你可以在[模块](Module-Development-Basics.md)的`ConfigureServices` 方法配置选项.
:
````csharp
public override void ConfigureServices(ServiceConfigurationContext context)
@ -34,7 +34,7 @@ public class MyOptions
}
````
然后开发人员可以像上面 `AbpAuditingOptions` 示例一样配置你的选项
然后开发人员可以像上面 `AbpAuditingOptions` 示例一样配置你的选项:
````csharp
public override void ConfigureServices(ServiceConfigurationContext context)
@ -80,9 +80,9 @@ public class MyService : ITransientDependency
如果你正在开发一个模块,可能需要让开发者能够设置一些选项,并在依赖注入注册阶段使用这些选项. 你可能需要根据选项值配置其他服务或更改依赖注入的注册代码.
对于此类情况,ABP为 `IServiceCollection` 引入了 `PreConfigure<TOptions>``ExecutePreConfiguredActions<TOptions>` 扩展方法. 该模式的工作原理如下所述
对于此类情况,ABP为 `IServiceCollection` 引入了 `PreConfigure<TOptions>``ExecutePreConfiguredActions<TOptions>` 扩展方法. 该模式的工作原理如下所述.
1. 你的模块中定义计划选项类. 例
1. 你的模块中定义计划选项类. 例:
````csharp
public class MyPreOptions
@ -92,7 +92,7 @@ public class MyPreOptions
````
然后任何依赖于模块的模块类都可以在其 `PreConfigureServices` 方法中使用 `PreConfigure<TOptions>` 方法.
:
````csharp
public override void PreConfigureServices(ServiceConfigurationContext context)

24
docs/zh-Hans/Samples/Microservice-Demo.md

@ -51,13 +51,13 @@ ABP框架的主要目标之一就是提供[便捷的基础设施来创建微服
### 创建数据库
MongoDB 数据库是动态创建的,但是你需要创建 SQL server 数据库的结构。其实你可以很轻松的创建数据库,因为这个解决方案配置了使用 Entity Core Code First 来做迁移。
MongoDB 数据库是动态创建的,但是你需要创建 SQL server 数据库的结构.其实你可以很轻松的创建数据库,因为这个解决方案配置了使用 Entity Core Code First 来做迁移.
这个解决方案中有两个 SQL server 数据库
这个解决方案中有两个 SQL server 数据库.
#### MsDemo_Identity 数据库
* 右键 `AuthServer.Host` 项目然后点击 `设置为启动项目`.
* 右键 `AuthServer.Host` 项目,然后点击 `设置为启动项目`.
* 打开 **程序包管理器控制台** (工具 -> NuGet 包管理器 -> 程序包管理器控制台)
* 选择 `AuthServer.Host` 成为 **默认项目**.
* 执行 `Update-Database` 命令.
@ -66,7 +66,7 @@ MongoDB 数据库是动态创建的,但是你需要创建 SQL server 数据库
#### MsDemo_ProductManagement
* 右键 `ProductService.Host` 项目然后点击 `设置为启动项目`.
* 右键 `ProductService.Host` 项目,然后点击 `设置为启动项目`.
* 打开 **程序包管理器控制台** (工具 -> NuGet 包管理器 -> 程序包管理器控制台)
* 选择 `ProductService.Host` 成为 **默认项目**.
* 执行 `Update-Database` 命令.
@ -334,7 +334,7 @@ context.Services.AddAuthentication(options =>
- 它需要额外的身份范围 *role*, *email* and *phone*.
- 它需要API资源范围 *PublicWebSiteGateway*,*BloggingService*和*ProductService*,因为它将这些服务用作API.
IdentityServer客户端设置存储在`appsettings.json`文件中
IdentityServer客户端设置存储在`appsettings.json`文件中:
```json
"AuthServer": {
@ -348,7 +348,7 @@ IdentityServer客户端设置存储在`appsettings.json`文件中:
PublicWebSite.Host项目有一个列出产品的页面 (`Pages/Products.cshtml`). 它还使用博客模块中的UI. 为此`PublicWebSiteHostModule`加入了`BloggingWebModule`(*[Volo.Blogging.Web](https://www.nuget.org/packages/Volo.Blogging.Web)* 包)的依赖项.
产品页面的屏幕截图
产品页面的屏幕截图:
![microservice-sample-public-product-list](../images/microservice-sample-public-product-list.png)
@ -390,7 +390,7 @@ PublicWebSite.Host项目有一个列出产品的页面 (`Pages/Products.cshtml`)
#### 远程服务配置
`appsettings.json`文件中的`RemoteService`配置很简单
`appsettings.json`文件中的`RemoteService`配置很简单:
````json
"RemoteServices": {
@ -418,7 +418,7 @@ PublicWebSite.Host项目有一个列出产品的页面 (`Pages/Products.cshtml`)
}
````
此示例使用`client_credentials` 授予类型,该类型需要`ClientId`和`ClientSecret`进行身份验证过程. 还有[其他授予类型](http://docs.identityserver.io/en/latest/topics/grant_types.html). 例如, 你可以使用以下配置切换到`password`(Resource Owner Password)授予类型
此示例使用`client_credentials` 授予类型,该类型需要`ClientId`和`ClientSecret`进行身份验证过程. 还有[其他授予类型](http://docs.identityserver.io/en/latest/topics/grant_types.html). 例如, 你可以使用以下配置切换到`password`(Resource Owner Password)授予类型:
````json
"IdentityClients": {
@ -571,7 +571,7 @@ app.UseOcelot().Wait();
#### 权限管理
后端管理应用程序提供权限管理UI(之前见过),并使用此网关获取/设置权限. 权限管理API托管在网关内,而不是单独的服务. 这是一个设计决策,但如果愿意,它可以作为另一个微服务托管.
后端管理应用程序提供权限管理UI(之前见过),并使用此网关获取/设置权限. 权限管理API托管在网关内,而不是单独的服务. 这是一个设计决策,但如果愿意,它可以作为另一个微服务托管.
#### Dependencies
@ -1229,7 +1229,7 @@ public class ProductCodeAlreadyExistsException : BusinessException
}
````
`PM000001`是发送给客户端的异常类型的代码,因此他们可以理解错误类型. 在这种情况下没有实现,但也可以本地化业务异常. 请参阅[异常处理文档](../Exception-Handling.md).
`PM:000001`是发送给客户端的异常类型的代码,因此他们可以理解错误类型. 在这种情况下没有实现,但也可以本地化业务异常. 请参阅[异常处理文档](../Exception-Handling.md).
#### 应用层
@ -1278,7 +1278,7 @@ public async Task<ProductDto> UpdateAsync(Guid id, UpdateProductDto input)
分布式事件(事件总线)是一种消息传递方式,其中服务引发/触发事件,而其他服务注册/侦听这些事件,以便在发生重要事件时得到通知. ABP通过提供约定,服务和集成使分布式事件更易于使用.
已经看到`Product`类使用以下代码行发布事件:
已经看到`Product`类使用以下代码行发布事件:
````csharp
AddDistributedEvent(new ProductStockCountChangedEto(Id, StockCount, stockCount));
@ -1406,7 +1406,7 @@ Kibana URL默认为`http://localhost:5601/`.
ABP提供自动审计日志记录,详细保存每个请求(当前用户,浏览器/客户端,执行了哪些操作,哪些实体更改,甚至实体的哪些属性已更新). 有关详细信息,请参阅[审计日志文档](../Audit-Logging.md).
所有服务和应用程序都配置为编写审核日志. 审核日志将保存到MsDemo_Identity SQL数据库中. 因此,可以从单个点查询所有应用程序的所有审核日志.
所有服务和应用程序都配置为编写审核日志. 审核日志将保存到MsDemo_Identity SQL数据库中. 因此,可以从单个点查询所有应用程序的所有审核日志.
审核日志记录具有`CorrelationId`属性,可用于跟踪请求. 当服务在单个Web请求中调用另一个服务时,它们都会使用相同的`CorrelationId`保存审核日志. 请参阅数据库中的`AbpAuditLogs`表.

2
docs/zh-Hans/Settings.md

@ -226,6 +226,6 @@ Configure<AbpSettingOptions>(options =>
## 设置管理模块
设置系统核心是相当独立的,不做任何关于如何管理(更改)设置值的假设. 默认的`ISettingStore`实现也是`NullSettingStore`它为所有设置值返回null.
设置系统核心是相当独立的,不做任何关于如何管理(更改)设置值的假设. 默认的`ISettingStore`实现也是`NullSettingStore`,它为所有设置值返回null.
设置管理模块通过管理数据库中的设置值来完成逻辑(实现`ISettingStore`).有关更多信息参阅[设置管理模块](Modules/Setting-Management.md)学习更多.

4
docs/zh-Hans/Startup-Templates/Application.md

@ -348,7 +348,7 @@ Home模块是一个可延迟加载的模块, 它加载应用程序的根地址.
React 本机应用程序是用 [Expo](https://expo.io/)生成的. Expo 是一套基于 React Native 构建的工具, 帮助你快速启动一个应用程序, 尽管它有很多功能.
React Native 应用文件夹结构, 如下图所示
React Native 应用文件夹结构, 如下图所示:
![react-native-folder-structure](../images/react-native-folder-structure.png)
@ -380,7 +380,7 @@ Screens 是通过在 `src/screens` 文件夹中创建将名称分开的文件夹
[Redux](https://redux.js.org/) 被用作状态管理库. [Redux Toolkit](https://redux-toolkit.js.org/) 库被用作高效Redux开发的工具集.
`src/store` 文件夹中创建 Actions, reducers, sagas, selectors. 存储文件夹如下
`src/store` 文件夹中创建 Actions, reducers, sagas, selectors. 存储文件夹如下:
![react-native-store-folder](../images/react-native-store-folder.png)

2
docs/zh-Hans/Startup-Templates/Index.md

@ -2,7 +2,7 @@
虽然你可以从一个空项目开始并手动添加所需的包,但启动模板可以非常轻松,舒适地使用ABP框架启动新的解决方案.
单击下面列表中的名称以查看相关启动模板的文档
单击下面列表中的名称以查看相关启动模板的文档:
* [**app**](Application.md): 应用程序模板.
* [**module**](Module.md): 模块/服务模板.

8
docs/zh-Hans/Tutorials/AspNetCore-Mvc/Part-I.md

@ -33,7 +33,7 @@
- `Acme.BookStore.Domain`包含你的[实体](https://docs.abp.io/zh-Hans/abp/latest/Entities), [领域服务](https://docs.abp.io/zh-Hans/abp/latest/Domain-Services)和其他核心域对象.
- `Acme.BookStore.Domain.Shared`包含可与客户共享的常量,枚举或其他域相关对象.
在解决方案的**领域层**(`Acme.BookStore.Domain`项目)中定义[实体](https://docs.abp.io/zh-Hans/abp/latest/Entities). 该应用程序的主要实体是`Book`. 在`Acme.BookStore.Domain`项目中创建一个名为`Book`的类,如下所示:
在解决方案的**领域层**(`Acme.BookStore.Domain`项目)中定义[实体](https://docs.abp.io/zh-Hans/abp/latest/Entities). 该应用程序的主要实体是`Book`. 在`Acme.BookStore.Domain`项目中创建一个名为`Book`的类,如下所示:
````C#
using System;
@ -132,7 +132,7 @@ PM> Update-Database
#### 添加示例数据
`Update-Database`命令在数据库中创建了`AppBooks`表. 打开数据库并输入几个示例行以便在页面上显示它们:
`Update-Database`命令在数据库中创建了`AppBooks`表. 打开数据库并输入几个示例行,以便在页面上显示它们:
![bookstore-books-table](images/bookstore-books-table.png)
@ -290,7 +290,7 @@ namespace Acme.BookStore
#### Swagger UI
启动模板配置为使用[Swashbuckle.AspNetCore](https://github.com/domaindrivendev/Swashbuckle.AspNetCore)运行[swagger UI](https://swagger.io/tools/swagger-ui/). 运行应用程序并在浏览器中输入`https://localhost:XXXX/swagger/`(用自己的端口替换XXXX)作为URL.
启动模板配置为使用[Swashbuckle.AspNetCore](https://github.com/domaindrivendev/Swashbuckle.AspNetCore)运行[swagger UI](https://swagger.io/tools/swagger-ui/). 运行应用程序并在浏览器中输入`https://localhost:XXXX/swagger/`(用自己的端口替换XXXX)作为URL.
你会看到一些内置的接口和`Book`的接口,它们都是REST风格的:
@ -380,7 +380,7 @@ context.Menu.AddItem(
![bookstore-localization-files](images/bookstore-localization-files-v2.png)
打开`en.json`文件,将`Menu:BookStore`和`Menu:Books`键的本地化文本添加到文件末尾:
打开`en.json`文件,将`Menu:BookStore`和`Menu:Books`键的本地化文本添加到文件末尾:
````json
{

4
docs/zh-Hans/Tutorials/AspNetCore-Mvc/Part-III.md

@ -14,7 +14,7 @@
### 解决方案中的测试项目
解决方案中有多个测试项目
解决方案中有多个测试项目:
![bookstore-test-projects-v2](images/bookstore-test-projects-v2.png)
@ -68,7 +68,7 @@ namespace Acme.BookStore
````
* 注入`IRepository<Book,Guid>`并在`SeedAsync`中使用它来创建两个书实体作为测试数据.
* 使用`IGuidGenerator`服务创建GUID. 虽然`Guid.NewGuid()`非常适合测试但`IGuidGenerator`在使用真实数据库时还有其他特别重要的功能(参见[Guid生成文档](../../../Guid-Generation.md)了解更多信息).
* 使用`IGuidGenerator`服务创建GUID. 虽然`Guid.NewGuid()`非常适合测试,但`IGuidGenerator`在使用真实数据库时还有其他特别重要的功能(参见[Guid生成文档](../../../Guid-Generation.md)了解更多信息).
### 测试 BookAppService

2
docs/zh-Hans/UI/Angular/Component-Replacement.md

@ -2,7 +2,7 @@
你可以将一些ABP的组件替换为你自己的自定义组件.
可以**替换**但**不能自定义**默认ABP组件的原因是禁用或更改该组件的一部分可能会导致问题. 所以我们把这些组件称为可替换组件.
可以**替换**但**不能自定义**默认ABP组件的原因是禁用或更改该组件的一部分可能会导致问题. 所以我们把这些组件称为可替换组件.
### 如何替换组件

8
docs/zh-Hans/UI/Angular/Config-State.md

@ -164,7 +164,7 @@ const hasIdentityOrAccountPermission = this.config.getGrantedPolicy(
### 如何从Store中获取翻译
`ConfigStateService``getLocalization` 用法翻译. 这里有一些示例:
`ConfigStateService``getLocalization` 方法用于翻译. 这里有一些示例:
```js
// this.config is instance of ConfigStateService
@ -186,7 +186,7 @@ const defaultValue = this.config.getLocalization({
## 分发方法
`ConfigStateService` 有几种分发方法让你方便地将预定义操作分发到 `Store`.
`ConfigStateService` 有几种分发方法,让你方便地将预定义操作分发到 `Store`.
### 如何从服务器获取应用程序配置
@ -245,7 +245,7 @@ this.config.dispatchAddRoute(newRoute);
`newRoute` 将被放置在根级别,没有任何父路由,并且其url将存储为 `'/path'`.
如果你想要**添加一个子路由,可以这样做:**
如果你想要**添加一个子路由,可以这样做:**
```js
// this.config is instance of ConfigStateService
@ -291,4 +291,4 @@ this.config.dispatchSetEnvironment({
## 下一步是什么?
* [组件替换]](./Component-Replacement.md)
* [组件替换](./Component-Replacement.md)

2
docs/zh-Hans/UI/Angular/Content-Strategy.md

@ -1,6 +1,6 @@
# ContentStrategy
`ContentStrategy` 是@abp/ng.core包暴露出的抽象类. 它可以帮助创建内联脚本或样式.
`ContentStrategy` 是@abp/ng.core包暴露出的抽象类. 它可以帮助创建内联脚本或样式.
## API

2
docs/zh-Hans/UI/Angular/Context-Strategy.md

@ -76,7 +76,7 @@ setContext(): undefined
CONTEXT_STRATEGY.None()
```
该策略不会将任何上下文传递到投影内容
该策略不会将任何上下文传递到投影内容.
### Component

10
docs/zh-Hans/UI/Angular/Dom-Insertion-Service.md

@ -125,6 +125,16 @@ removeContent(element: HTMLScriptElement | HTMLStyleElement): void
- `element` 参数是已插入的 `HTMLScriptElement``HTMLStyleElement` 元素,它们应由 `insertContent` 方法返回.
### has
```js
has(content: string): boolean
```
`has` 返回一个布尔值,用于表示给定的内容是否插入到DOM.
- `content` 参数是 `HTMLScriptElement``HTMLStyleElement` 元素的内容.
## 下一步是什么?
- [ContentProjectionService](./Content-Projection-Service.md)

2
docs/zh-Hans/UI/Angular/Lazy-Load-Service.md

@ -162,7 +162,7 @@ class DemoComponent {
}
```
在此示例中,第二个文件需要预先加载第一个文件, RxJS `concat` 函数将允许你以给定的顺序一个接一个地加载所有脚本并且仅在加载所有脚本时放行.
在此示例中,第二个文件需要预先加载第一个文件, RxJS `concat` 函数将允许你以给定的顺序一个接一个地加载所有脚本,并且仅在加载所有脚本时放行.
## API

2
docs/zh-Hans/UI/Angular/Permission-Management.md

@ -2,7 +2,7 @@
权限是为特定用户,角色或客户端授予或禁止的简单策略. 你可以在[ABP授权文档](../../Authorization.md)中阅读更多信息.
可以使用 `ConfigState``getGrantedPolicy` 选择器获取经过身份验证的用户的权限.
可以使用 `ConfigState``getGrantedPolicy` 选择器获取经过身份验证的用户的权限.
你可以从Store中获取权限的布尔值:

2
docs/zh-Hans/UI/AspNetCore/Bundling-Minification.md

@ -234,7 +234,7 @@ public class MyExtensionStyleBundleContributor : BundleContributor
#### 贡献者扩展
在某些高级应用场景中, 当用到一个bundle贡献者时你可能想做一些额外的配置. 贡献者扩展可以和被扩展的贡献者无缝衔接.
在某些高级应用场景中, 当用到一个bundle贡献者时,你可能想做一些额外的配置. 贡献者扩展可以和被扩展的贡献者无缝衔接.
下面的示例为 prism.js 脚本库添加一些样式:

2
docs/zh-Hans/UI/AspNetCore/Tag-Helpers/Progress-Bars.md

@ -47,7 +47,7 @@
### min-value
进度条的最小值. 默认值是0
进度条的最小值. 默认值是0.
### max-value

4
docs/zh-Hans/Validation.md

@ -8,7 +8,7 @@ ABP增加了以下优点:
* 定义 `IValidationEnabled` 向任意类添加自动验证. 所有的[应用服务](Application-Services.md)都实现了该接口,所以它们会被自动验证.
* 自动将数据注解属性的验证错误信息本地化.
* 提供可扩展的服务来验证方法调用或对象的状态
* 提供可扩展的服务来验证方法调用或对象的状态.
* 提供[FluentValidation](https://fluentvalidation.net/)的集成.
## 验证DTO
@ -80,7 +80,7 @@ namespace Acme.BookStore
#### 解析服务
如果你需要从[依赖注入系统](Dependency-Injection.md)解析服务,可以使用 `ValidationContext` 对象.
:
````csharp
var myService = validationContext.GetRequiredService<IMyService>();

2
docs/zh-Hans/Virtual-File-System.md

@ -35,7 +35,7 @@ namespace MyCompany.MyProject
![build-action-embedded-resource-sample](images/build-action-embedded-resource-sample.png)
如果需要添加多个文件, 这样做会很乏味. 作为选择 你可以直接编辑 **.csproj** 文件:
如果需要添加多个文件, 这样做会很乏味. 作为选择, 你可以直接编辑 **.csproj** 文件:
````C#
<ItemGroup>

Loading…
Cancel
Save