From 1b3425b5bf4b9b16a386ad89f9906075753d9d60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A2=81=E5=A3=AB=E4=BC=9F?= Date: Sun, 28 Oct 2018 13:38:36 +0800 Subject: [PATCH 1/3] Improve translation details. --- docs/zh-Hans/AspNetCore/Bundling-Minification.md | 6 +++--- docs/zh-Hans/AspNetCore/Client-Side-Package-Management.md | 2 +- docs/zh-Hans/Best-Practices/Application-Services.md | 8 ++++---- docs/zh-Hans/Exception-Handling.md | 2 +- docs/zh-Hans/Getting-Started-AspNetCore-MVC-Template.md | 2 +- docs/zh-Hans/Getting-Started-Console-Application.md | 4 ++-- docs/zh-Hans/Localization.md | 4 ++-- docs/zh-Hans/Repositories.md | 2 +- docs/zh-Hans/Virtual-File-System.md | 2 +- 9 files changed, 16 insertions(+), 16 deletions(-) diff --git a/docs/zh-Hans/AspNetCore/Bundling-Minification.md b/docs/zh-Hans/AspNetCore/Bundling-Minification.md index 32649f5c07..4dc6d69c35 100644 --- a/docs/zh-Hans/AspNetCore/Bundling-Minification.md +++ b/docs/zh-Hans/AspNetCore/Bundling-Minification.md @@ -13,7 +13,7 @@ ABP内置了简单,动态,强大,模块化的方式. > 默认情况下已在启动模板安装此软件包. 大多数情况下,你不需要手动安装它. -将`Volo.Abp.AspNetCore.Mvc.UI.Bundling` nuget包安装到您的项目中: +将`Volo.Abp.AspNetCore.Mvc.UI.Bundling` nuget包安装到你的项目中: ```` install-package Volo.Abp.AspNetCore.Mvc.UI.Bundling @@ -132,7 +132,7 @@ public class MyWebModule : AbpModule } ```` -> 您可以在脚本和样式包中使用相同的名称(*MyGlobalBundle*), 因为它们被添加到不同的集合(`ScriptBundles`和`StyleBundles`). +> 你可以在脚本和样式包中使用相同的名称(*MyGlobalBundle*), 因为它们被添加到不同的集合(`ScriptBundles`和`StyleBundles`). 在定义bundle之后, 可以使用上面定义的相同tag helpers将其包括在页面中. 例如: @@ -311,7 +311,7 @@ services.Configure(options => 建议为应用程序定义多个包, 每个包用于不同的目的. -* **全局包**: 应用程序中的每个页面都包含全局样式/脚本包. 主题已经定义了全局样式和脚本包. 您的模块可以为他们做出贡献. +* **全局包**: 应用程序中的每个页面都包含全局样式/脚本包. 主题已经定义了全局样式和脚本包. 你的模块可以为他们做出贡献. * **布局包**: 这是针对单个布局的特定包. 仅包含在所有页面之间共享的资源使用布局. 使用bundling tag helpers创建捆绑包是一种很好的做法. * **模块包**: 用于单个模块页面之间的共享资源. * **页面包**: 为每个页面创建的特定包. 使用bundling tag helpers创建捆绑包作为最佳实践. diff --git a/docs/zh-Hans/AspNetCore/Client-Side-Package-Management.md b/docs/zh-Hans/AspNetCore/Client-Side-Package-Management.md index f41e6d9310..4d45022da0 100644 --- a/docs/zh-Hans/AspNetCore/Client-Side-Package-Management.md +++ b/docs/zh-Hans/AspNetCore/Client-Side-Package-Management.md @@ -45,7 +45,7 @@ yarn #### 贡献包 -如果你需要不在标准软件包中的第三方NPM软件包,您可以在Github[repository](https://github.com/volosoft/abp)上创建Pull请求. 接受遵循这些规则的拉取请求: +如果你需要不在标准软件包中的第三方NPM软件包,你可以在Github[repository](https://github.com/volosoft/abp)上创建Pull请求. 接受遵循这些规则的拉取请求: * 对于NPM上的`package-name`, 包名称应该命名为`@abp/package-name`(例如:`bootstrap`包的`@abp/bootstrap`). * 它应该是**最新的稳定**版本的包. diff --git a/docs/zh-Hans/Best-Practices/Application-Services.md b/docs/zh-Hans/Best-Practices/Application-Services.md index 2c48de379b..90f5fd4606 100644 --- a/docs/zh-Hans/Best-Practices/Application-Services.md +++ b/docs/zh-Hans/Best-Practices/Application-Services.md @@ -86,7 +86,7 @@ public class LabelDto : EntityDto * **推荐** 为异步方法使用 **Async** 后缀. * **不推荐** 在方法名中重复实体的名称. - * 例如: 在 `IProductAppService` 中定义`GetProductAsync(...)` 而不是 `GetAsync(...)` . + * 例如: 在 `IProductAppService` 中定义`GetAsync(...)` 而不是 `GetProductAsync(...)` . ##### 获取单一实体 @@ -104,7 +104,7 @@ Task GetAsync(Guid id); * **推荐** 如果需要获取单个DTO可以使用参数进行 **过滤**, **排序** 和 **分页**. * **推荐** 尽可能让过滤参数可选. * **推荐** 将排序与分页属性设置为可选, 并且提供默认值. - * **推荐** 限制最大页数大小 (基本性能考虑). + * **推荐** 限制最大页数大小 (基于性能考虑). * **推荐** 返回 **详细DTO**集合. 示例: ````C# @@ -116,7 +116,7 @@ Task> GetListAsync(QuestionListQueryDto queryDto); * **推荐** 使用 `CreateAsync` 做为**方法名**. * **推荐** 使用**专门的输入DTO**来创建实体. * **推荐** 使用 **data annotations** 进行输入验证. - * 尽可能在**领域**之间共享常量(通过域**domain shared** package定义的常量). + * 尽可能在**领域**之间共享常量(通过**domain shared** package定义的常量). * **推荐** 只需要创建实体的**最少**信息, 但是提供了其他可选属性. 示例**方法**: @@ -147,7 +147,7 @@ public class CreateQuestionDto - **推荐** 使用**专门的输入DTO**来更新实体. - **推荐** 获取实体的id做为分离的原始参数. 不要包含更新DTO. - **推荐** 使用 **data annotations** 进行输入验证. - - 尽可能在**领域**之间共享常量(通过域**domain shared** package定义的常量). + - 尽可能在**领域**之间共享常量(通过**domain shared** package定义的常量). - **推荐** 返回更新实体的**详细**DTO. 示例: diff --git a/docs/zh-Hans/Exception-Handling.md b/docs/zh-Hans/Exception-Handling.md index 444608dd77..ac68058883 100644 --- a/docs/zh-Hans/Exception-Handling.md +++ b/docs/zh-Hans/Exception-Handling.md @@ -81,7 +81,7 @@ ABP提供了用于处理Web应用程序异常的标准模型. } ```` -`AbpValidationException`已经实现了`IHasValidationErrors`接口,当请求输入无效时,框架会自动抛出此错误. 因此,除非您有自定义的验证逻辑,否则不需要处理验证错误. +`AbpValidationException`已经实现了`IHasValidationErrors`接口,当请求输入无效时,框架会自动抛出此错误. 因此,除非你有自定义的验证逻辑,否则不需要处理验证错误. #### 日志 diff --git a/docs/zh-Hans/Getting-Started-AspNetCore-MVC-Template.md b/docs/zh-Hans/Getting-Started-AspNetCore-MVC-Template.md index a03de5b188..ebb832c04b 100644 --- a/docs/zh-Hans/Getting-Started-AspNetCore-MVC-Template.md +++ b/docs/zh-Hans/Getting-Started-AspNetCore-MVC-Template.md @@ -60,7 +60,7 @@ The solution is configured to use **Entity Framework Core** with **MS SQL Server ### 运行应用程序 -您现在可以运行应用程序,它将会打开**home**页面: +你现在可以运行应用程序,它将会打开**home**页面: ![bookstore-homepage](images/bookstore-homepage.png) diff --git a/docs/zh-Hans/Getting-Started-Console-Application.md b/docs/zh-Hans/Getting-Started-Console-Application.md index c273f65ff9..6c38d86601 100644 --- a/docs/zh-Hans/Getting-Started-Console-Application.md +++ b/docs/zh-Hans/Getting-Started-Console-Application.md @@ -1,6 +1,6 @@ ## 使用Console Application -本教程将介绍如何从头开始以最小的依赖关系启动ABP. 您通常希望以 **[启动模板](https://abp.io/Templates)** 开头. +本教程将介绍如何从头开始以最小的依赖关系启动ABP. 你通常希望以 **[启动模板](https://abp.io/Templates)** 开头. ### 创建一个新项目 @@ -10,7 +10,7 @@ ### 安装 Volo.Abp 包 -Volo.Abp.Core是创建基于ABP的应用程序的核心nuget包. 所以,将它安装到您的项目中: +Volo.Abp.Core是创建基于ABP的应用程序的核心nuget包. 所以,将它安装到你的项目中: ```` Install-Package Volo.Abp.Core diff --git a/docs/zh-Hans/Localization.md b/docs/zh-Hans/Localization.md index bcd12a0fc6..b98163b66d 100644 --- a/docs/zh-Hans/Localization.md +++ b/docs/zh-Hans/Localization.md @@ -12,7 +12,7 @@ Volo.Abp.Localization是本地化系统的核心包. 使用程序包管理器控 Install-Package Volo.Abp.Localization ``` -然后,您可以将 **AbpLocalizationModule** 依赖项添加到您的模块: +然后, 你可以将 **AbpLocalizationModule** 依赖项添加到模块: ```c# using Volo.Abp.Modularity; @@ -126,7 +126,7 @@ services.Configure(options => ##### 扩展现有资源 -继承资源可以创建新的资源, 无需修改现有的资源. 但是在某些情况下, 您可能不想创建新资源,而是直接扩展现有资源. 例如: +继承资源可以创建新的资源, 无需修改现有的资源. 但是在某些情况下, 你可能不想创建新资源,而是直接扩展现有资源. 例如: ````C# services.Configure(options => diff --git a/docs/zh-Hans/Repositories.md b/docs/zh-Hans/Repositories.md index 930bfa5af4..00979db1af 100644 --- a/docs/zh-Hans/Repositories.md +++ b/docs/zh-Hans/Repositories.md @@ -76,7 +76,7 @@ ABP提供了 `IBasicRepository` 和 `IBasicRepository Date: Sun, 28 Oct 2018 13:38:36 +0800 Subject: [PATCH 2/3] Improve translation details. --- docs/zh-Hans/AspNetCore/Bundling-Minification.md | 6 +++--- docs/zh-Hans/AspNetCore/Client-Side-Package-Management.md | 2 +- docs/zh-Hans/Best-Practices/Application-Services.md | 8 ++++---- docs/zh-Hans/Exception-Handling.md | 2 +- docs/zh-Hans/Getting-Started-AspNetCore-MVC-Template.md | 2 +- docs/zh-Hans/Getting-Started-Console-Application.md | 4 ++-- docs/zh-Hans/Localization.md | 4 ++-- docs/zh-Hans/Repositories.md | 2 +- docs/zh-Hans/Virtual-File-System.md | 2 +- 9 files changed, 16 insertions(+), 16 deletions(-) diff --git a/docs/zh-Hans/AspNetCore/Bundling-Minification.md b/docs/zh-Hans/AspNetCore/Bundling-Minification.md index 32649f5c07..4dc6d69c35 100644 --- a/docs/zh-Hans/AspNetCore/Bundling-Minification.md +++ b/docs/zh-Hans/AspNetCore/Bundling-Minification.md @@ -13,7 +13,7 @@ ABP内置了简单,动态,强大,模块化的方式. > 默认情况下已在启动模板安装此软件包. 大多数情况下,你不需要手动安装它. -将`Volo.Abp.AspNetCore.Mvc.UI.Bundling` nuget包安装到您的项目中: +将`Volo.Abp.AspNetCore.Mvc.UI.Bundling` nuget包安装到你的项目中: ```` install-package Volo.Abp.AspNetCore.Mvc.UI.Bundling @@ -132,7 +132,7 @@ public class MyWebModule : AbpModule } ```` -> 您可以在脚本和样式包中使用相同的名称(*MyGlobalBundle*), 因为它们被添加到不同的集合(`ScriptBundles`和`StyleBundles`). +> 你可以在脚本和样式包中使用相同的名称(*MyGlobalBundle*), 因为它们被添加到不同的集合(`ScriptBundles`和`StyleBundles`). 在定义bundle之后, 可以使用上面定义的相同tag helpers将其包括在页面中. 例如: @@ -311,7 +311,7 @@ services.Configure(options => 建议为应用程序定义多个包, 每个包用于不同的目的. -* **全局包**: 应用程序中的每个页面都包含全局样式/脚本包. 主题已经定义了全局样式和脚本包. 您的模块可以为他们做出贡献. +* **全局包**: 应用程序中的每个页面都包含全局样式/脚本包. 主题已经定义了全局样式和脚本包. 你的模块可以为他们做出贡献. * **布局包**: 这是针对单个布局的特定包. 仅包含在所有页面之间共享的资源使用布局. 使用bundling tag helpers创建捆绑包是一种很好的做法. * **模块包**: 用于单个模块页面之间的共享资源. * **页面包**: 为每个页面创建的特定包. 使用bundling tag helpers创建捆绑包作为最佳实践. diff --git a/docs/zh-Hans/AspNetCore/Client-Side-Package-Management.md b/docs/zh-Hans/AspNetCore/Client-Side-Package-Management.md index f41e6d9310..4d45022da0 100644 --- a/docs/zh-Hans/AspNetCore/Client-Side-Package-Management.md +++ b/docs/zh-Hans/AspNetCore/Client-Side-Package-Management.md @@ -45,7 +45,7 @@ yarn #### 贡献包 -如果你需要不在标准软件包中的第三方NPM软件包,您可以在Github[repository](https://github.com/volosoft/abp)上创建Pull请求. 接受遵循这些规则的拉取请求: +如果你需要不在标准软件包中的第三方NPM软件包,你可以在Github[repository](https://github.com/volosoft/abp)上创建Pull请求. 接受遵循这些规则的拉取请求: * 对于NPM上的`package-name`, 包名称应该命名为`@abp/package-name`(例如:`bootstrap`包的`@abp/bootstrap`). * 它应该是**最新的稳定**版本的包. diff --git a/docs/zh-Hans/Best-Practices/Application-Services.md b/docs/zh-Hans/Best-Practices/Application-Services.md index 2c48de379b..90f5fd4606 100644 --- a/docs/zh-Hans/Best-Practices/Application-Services.md +++ b/docs/zh-Hans/Best-Practices/Application-Services.md @@ -86,7 +86,7 @@ public class LabelDto : EntityDto * **推荐** 为异步方法使用 **Async** 后缀. * **不推荐** 在方法名中重复实体的名称. - * 例如: 在 `IProductAppService` 中定义`GetProductAsync(...)` 而不是 `GetAsync(...)` . + * 例如: 在 `IProductAppService` 中定义`GetAsync(...)` 而不是 `GetProductAsync(...)` . ##### 获取单一实体 @@ -104,7 +104,7 @@ Task GetAsync(Guid id); * **推荐** 如果需要获取单个DTO可以使用参数进行 **过滤**, **排序** 和 **分页**. * **推荐** 尽可能让过滤参数可选. * **推荐** 将排序与分页属性设置为可选, 并且提供默认值. - * **推荐** 限制最大页数大小 (基本性能考虑). + * **推荐** 限制最大页数大小 (基于性能考虑). * **推荐** 返回 **详细DTO**集合. 示例: ````C# @@ -116,7 +116,7 @@ Task> GetListAsync(QuestionListQueryDto queryDto); * **推荐** 使用 `CreateAsync` 做为**方法名**. * **推荐** 使用**专门的输入DTO**来创建实体. * **推荐** 使用 **data annotations** 进行输入验证. - * 尽可能在**领域**之间共享常量(通过域**domain shared** package定义的常量). + * 尽可能在**领域**之间共享常量(通过**domain shared** package定义的常量). * **推荐** 只需要创建实体的**最少**信息, 但是提供了其他可选属性. 示例**方法**: @@ -147,7 +147,7 @@ public class CreateQuestionDto - **推荐** 使用**专门的输入DTO**来更新实体. - **推荐** 获取实体的id做为分离的原始参数. 不要包含更新DTO. - **推荐** 使用 **data annotations** 进行输入验证. - - 尽可能在**领域**之间共享常量(通过域**domain shared** package定义的常量). + - 尽可能在**领域**之间共享常量(通过**domain shared** package定义的常量). - **推荐** 返回更新实体的**详细**DTO. 示例: diff --git a/docs/zh-Hans/Exception-Handling.md b/docs/zh-Hans/Exception-Handling.md index 444608dd77..ac68058883 100644 --- a/docs/zh-Hans/Exception-Handling.md +++ b/docs/zh-Hans/Exception-Handling.md @@ -81,7 +81,7 @@ ABP提供了用于处理Web应用程序异常的标准模型. } ```` -`AbpValidationException`已经实现了`IHasValidationErrors`接口,当请求输入无效时,框架会自动抛出此错误. 因此,除非您有自定义的验证逻辑,否则不需要处理验证错误. +`AbpValidationException`已经实现了`IHasValidationErrors`接口,当请求输入无效时,框架会自动抛出此错误. 因此,除非你有自定义的验证逻辑,否则不需要处理验证错误. #### 日志 diff --git a/docs/zh-Hans/Getting-Started-AspNetCore-MVC-Template.md b/docs/zh-Hans/Getting-Started-AspNetCore-MVC-Template.md index a03de5b188..ebb832c04b 100644 --- a/docs/zh-Hans/Getting-Started-AspNetCore-MVC-Template.md +++ b/docs/zh-Hans/Getting-Started-AspNetCore-MVC-Template.md @@ -60,7 +60,7 @@ The solution is configured to use **Entity Framework Core** with **MS SQL Server ### 运行应用程序 -您现在可以运行应用程序,它将会打开**home**页面: +你现在可以运行应用程序,它将会打开**home**页面: ![bookstore-homepage](images/bookstore-homepage.png) diff --git a/docs/zh-Hans/Getting-Started-Console-Application.md b/docs/zh-Hans/Getting-Started-Console-Application.md index c273f65ff9..6c38d86601 100644 --- a/docs/zh-Hans/Getting-Started-Console-Application.md +++ b/docs/zh-Hans/Getting-Started-Console-Application.md @@ -1,6 +1,6 @@ ## 使用Console Application -本教程将介绍如何从头开始以最小的依赖关系启动ABP. 您通常希望以 **[启动模板](https://abp.io/Templates)** 开头. +本教程将介绍如何从头开始以最小的依赖关系启动ABP. 你通常希望以 **[启动模板](https://abp.io/Templates)** 开头. ### 创建一个新项目 @@ -10,7 +10,7 @@ ### 安装 Volo.Abp 包 -Volo.Abp.Core是创建基于ABP的应用程序的核心nuget包. 所以,将它安装到您的项目中: +Volo.Abp.Core是创建基于ABP的应用程序的核心nuget包. 所以,将它安装到你的项目中: ```` Install-Package Volo.Abp.Core diff --git a/docs/zh-Hans/Localization.md b/docs/zh-Hans/Localization.md index bcd12a0fc6..b98163b66d 100644 --- a/docs/zh-Hans/Localization.md +++ b/docs/zh-Hans/Localization.md @@ -12,7 +12,7 @@ Volo.Abp.Localization是本地化系统的核心包. 使用程序包管理器控 Install-Package Volo.Abp.Localization ``` -然后,您可以将 **AbpLocalizationModule** 依赖项添加到您的模块: +然后, 你可以将 **AbpLocalizationModule** 依赖项添加到模块: ```c# using Volo.Abp.Modularity; @@ -126,7 +126,7 @@ services.Configure(options => ##### 扩展现有资源 -继承资源可以创建新的资源, 无需修改现有的资源. 但是在某些情况下, 您可能不想创建新资源,而是直接扩展现有资源. 例如: +继承资源可以创建新的资源, 无需修改现有的资源. 但是在某些情况下, 你可能不想创建新资源,而是直接扩展现有资源. 例如: ````C# services.Configure(options => diff --git a/docs/zh-Hans/Repositories.md b/docs/zh-Hans/Repositories.md index 930bfa5af4..00979db1af 100644 --- a/docs/zh-Hans/Repositories.md +++ b/docs/zh-Hans/Repositories.md @@ -76,7 +76,7 @@ ABP提供了 `IBasicRepository` 和 `IBasicRepository Date: Fri, 2 Nov 2018 17:34:33 +0800 Subject: [PATCH 3/3] Complete translate the EF Core integration document. --- docs/en/Entity-Framework-Core.md | 10 +- docs/zh-Hans/Entity-Framework-Core.md | 232 ++++++++++++++++++++++++-- 2 files changed, 227 insertions(+), 15 deletions(-) diff --git a/docs/en/Entity-Framework-Core.md b/docs/en/Entity-Framework-Core.md index cf44a739b6..aef319d6a6 100644 --- a/docs/en/Entity-Framework-Core.md +++ b/docs/en/Entity-Framework-Core.md @@ -6,7 +6,7 @@ This document explains how to integrate EF Core as an ORM provider to ABP based `Volo.Abp.EntityFrameworkCore` is the main nuget package for the EF Core integration. Install it to your project (for a layered application, to your data/infrastructure layer): -```` +```` shell Install-Package Volo.Abp.EntityFrameworkCore ```` @@ -166,7 +166,7 @@ public class BookRepository : EfCoreRepository, public async Task DeleteBooksByType(BookType type) { - await DbContext.Database.ExecuteSqlCommandAsync( + await DbContext.Database.ExecuteSqlCommandAsync( $"DELETE FROM Books WHERE Type = {(int)type}" ); } @@ -193,8 +193,8 @@ This is especially important when you want to **override a base repository metho ````csharp public override async Task DeleteAsync( - Guid id, - bool autoSave = false, + Guid id, + bool autoSave = false, CancellationToken cancellationToken = default) { //TODO: Custom implementation of the delete method @@ -237,7 +237,7 @@ First, define your repository classes like that: ```csharp public class MyRepositoryBase - : EfCoreRepository + : EfCoreRepository where TEntity : class, IEntity { public MyRepositoryBase(IDbContextProvider dbContextProvider) diff --git a/docs/zh-Hans/Entity-Framework-Core.md b/docs/zh-Hans/Entity-Framework-Core.md index 77d26e9b2f..e709767652 100644 --- a/docs/zh-Hans/Entity-Framework-Core.md +++ b/docs/zh-Hans/Entity-Framework-Core.md @@ -4,13 +4,13 @@ ### 安装 -`Volo.Abp.EntityFrameworkCore` 是EF Core 集成的主要nuget包. 将其安装到你的项目中(在分层应用程序中适用于 数据/基础设施层): +`Volo.Abp.EntityFrameworkCore` 是EF Core 集成的主要nuget包. 将其安装到你的项目中(在分层应用程序中适用于 数据访问/基础设施层): -``` +```shell Install-Package Volo.Abp.EntityFrameworkCore ``` -然后添加 `AbpEntityFrameworkCoreModule` 模块依赖项到 [module](Module-Development-Basics.cn.md)(项目中的Mudole类): +然后添加 `AbpEntityFrameworkCoreModule` 模块依赖项(`DependsOn` Attribute) 到 [module](Module-Development-Basics.cn.md)(项目中的Mudole类): ````C# using Volo.Abp.EntityFrameworkCore; @@ -38,7 +38,7 @@ namespace MyCompany.MyProject { public class MyDbContext : AbpDbContext { - //...your DbSet properties + //...在这里添加 DbSet properties public MyDbContext(DbContextOptions options) : base(options) @@ -74,7 +74,7 @@ namespace MyCompany.MyProject #### 添加默认仓储 -ABP会自动为DbContext中的实体创建仓储 (TODO: link). 需要在注册的时使用`AddDefaultRepositories()`: +ABP会自动为DbContext中的实体创建[默认仓储](Repositories.md). 需要在注册的时使用options添加`AddDefaultRepositories()`: ````C# services.AddAbpDbContext(options => @@ -83,8 +83,8 @@ services.AddAbpDbContext(options => }); ```` -默认情况下为每个聚合根实体(从聚合体派生的类)创建一个仓储. 如果想要为其他实体也创建仓储 -需要把`includeAllEntities` 设置为 `true`: +默认情况下为每个[聚合根实体](Entities.md)(`AggregateRoot`派生的子类)创建一个仓储. 如果想要为其他实体也创建仓储 +请将`includeAllEntities` 设置为 `true`: ````C# services.AddAbpDbContext(options => @@ -95,14 +95,226 @@ services.AddAbpDbContext(options => 然后你就可以在服务中注入和使用 `IRepository` 或 `IQueryableRepository`. +假如你有一个主键是Guid名为Book实体(聚合根) + +```csharp +public class Book : AggregateRoot +{ + public string Name { get; set; } + + public BookType Type { get; set; } +} +``` + +在[领域服务](Domain-Services.md)中创建一个新的Book实例并且使用仓储持久化到数据库中 + +````csharp +public class BookManager : DomainService +{ + private readonly IRepository _bookRepository; + + public BookManager(IRepository bookRepository) //注入默认仓储 + { + _bookRepository = bookRepository; + } + + public async Task CreateBook(string name, BookType type) + { + Check.NotNullOrWhiteSpace(name, nameof(name)); + + var book = new Book + { + Id = GuidGenerator.Create(), + Name = name, + Type = type + }; + + await _bookRepository.InsertAsync(book); //使用仓储提供的标准方法 + + return book; + } +} +```` + +在这个示例中使用 `InsertAsync` 将新实例插入到数据库中 + #### 添加自定义仓储 -TODO ... +默认通用仓储可以满足大多数情况下的需求(它实现了`IQueryable`),但是你可能会需要自定义仓储与仓储方法. + +假设你需要根据图书类型删除所有的书籍. 建议为自定义仓储定义一个接口: + +````csharp +public interface IBookRepository : IRepository +{ + Task DeleteBooksByType(BookType type); +} +```` + +你通常希望从IRepository派生以继承标准存储库方法. 然而,你没有必要这样做. 仓储接口在分层应用程序的领域层中定义,它在数据访问/基础设施层([启动模板](https://cn.abp.io/Templates)中的`EntityFrameworkCore`项目)中实现 + +IBookRepository接口的实现示例: + +````csharp +public class BookRepository : EfCoreRepository, IBookRepository +{ + public BookRepository(IDbContextProvider dbContextProvider) + : base(dbContextProvider) + { + } + + public async Task DeleteBooksByType(BookType type) + { + await DbContext.Database.ExecuteSqlCommandAsync( + $"DELETE FROM Books WHERE Type = {(int)type}" + ); + } +} +```` + +现在可以在需要时[注入](Dependency-Injection.md)`IBookRepository`并使用`DeleteBooksByType`方法. + +##### 覆盖默认通用仓储 + +即使创建了自定义仓储,仍可以注入使用默认通用仓储(在本例中是 `IRepository`). 默认仓储实现不会使用你创建的自定义仓储类. + +如果要将默认仓储实现替换为自定义仓储,请在`AddAbpDbContext`使用options执行: + +````csharp +context.Services.AddAbpDbContext(options => +{ + options.AddDefaultRepositories(); + options.AddRepository(); +}); +```` + +在你想要覆盖默认仓储方法对其自定义时,这一点非常需要. 例如你可能希望自定义`DeleteAsync`方法覆盖默认实现 + +````csharp +public override async Task DeleteAsync( + Guid id, + bool autoSave = false, + CancellationToken cancellationToken = default) +{ + //TODO: Custom implementation of the delete method +} +```` + +#### 访问 EF Core API + +大多数情况下应该隐藏仓储后面的EF Core API(这也是仓储的设计目地). 但是如果想要通过仓储访问DbContext实现,则可以使用`GetDbContext()`或`GetDbSet()`扩展方法. 例: + +````csharp +public class BookService +{ + private readonly IRepository _bookRepository; + + public BookService(IRepository bookRepository) + { + _bookRepository = bookRepository; + } + + public void Foo() + { + DbContext dbContext = _bookRepository.GetDbContext(); + DbSet books = _bookRepository.GetDbSet(); + } +} +```` + +* `GetDbContext` 返回 `DbContext` 引用,而不是 `BookStoreDbContext`. 你可以释放它, 但大多数情况下你不会需要它. + +> 要点: 你必须在使用`DbContext`的项目里引用`Volo.Abp.EntityFrameworkCore`包. 这会破坏封装,但在这种情况下,这就是你需要的. + +#### 高级主题 + +##### 设置默认仓储类 + +默认的通用仓储的默认实现是`EfCoreRepository`类,你可以创建自己的实现,并将其做为默认实现 + +首先,像这样定义仓储类: + +```csharp +public class MyRepositoryBase + : EfCoreRepository + where TEntity : class, IEntity +{ + public MyRepositoryBase(IDbContextProvider dbContextProvider) + : base(dbContextProvider) + { + } +} + +public class MyRepositoryBase + : EfCoreRepository + where TEntity : class, IEntity +{ + public MyRepositoryBase(IDbContextProvider dbContextProvider) + : base(dbContextProvider) + { + } +} +``` + +第一个用于具有[复合主键的实体](Entities.md),第二个用于具有单个主键的实体 + +建议从`EfCoreRepository`类继承并在需要时重写方法. 否则,你需要手动实现所有标准仓储方法. + +现在,你可以使用SetDefaultRepositoryClasses Options + +```csharp +context.Services.AddAbpDbContext(options => +{ + options.SetDefaultRepositoryClasses( + typeof(MyRepositoryBase<,>), + typeof(MyRepositoryBase<>) + ); + //... +}); +``` #### 为默认仓储设置Base DbContext类或接口 -TODO ... +如果你的DbContext继承了另外一个DbContext或实现了一个接口,你可以使用这个基类或接口作为默认仓储的DbContext. 例: + +````csharp +public interface IBookStoreDbContext : IEfCoreDbContext +{ + DbSet Books { get; } +} +```` + +`IBookStoreDbContext`接口是由`BookStoreDbContext`实现的. 然后你可以使用`AddDefaultRepositories`的泛型重载. + +````csharp +context.Services.AddAbpDbContext(options => +{ + options.AddDefaultRepositories(); + //... +}); +```` + +现在,您的自定义仓储也可以使用`IBookStoreDbContext`接口: + +````csharp +public class BookRepository : EfCoreRepository, IBookRepository +{ + //... +} +```` + +使用DbContext接口的一个优点是它可以被其他实现替换. #### 替换其他仓储 -TODO ... \ No newline at end of file +正确定义并使用DbContext接口后,任何其他实现都可以使用以下ReplaceDbContext options 替换它: + +````csharp +context.Services.AddAbpDbContext(options => +{ + //... + options.ReplaceDbContext(); +}); +```` + +在这个例子中,`OtherDbContext`实现了`IBookStoreDbContext`. 此功能允许你在开发时使用多个DbContext(每个模块一个),但在运行时可以使用单个DbContext(实现所有DbContext的所有接口). \ No newline at end of file