Browse Source

Merge pull request #642 from cnAbp/Translate

Translate Background Jobs and improve other documents
pull/643/head
Halil İbrahim Kalkan 8 years ago
committed by GitHub
parent
commit
577fb928cf
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 3
      docs/zh-Hans/Background-Jobs-Hangfire.md
  2. 3
      docs/zh-Hans/Background-Jobs-RabbitMq.md
  3. 165
      docs/zh-Hans/Background-Jobs.md
  4. 10
      docs/zh-Hans/Best-Practices/Application-Services.md
  5. 3
      docs/zh-Hans/Best-Practices/Data-Transfer-Objects.md
  6. 3
      docs/zh-Hans/Emailing.md
  7. 4
      docs/zh-Hans/Getting-Started-AspNetCore-MVC-Template.md
  8. 2
      docs/zh-Hans/Index.md
  9. 3
      docs/zh-Hans/Modules/Background-Jobs.md
  10. 2
      docs/zh-Hans/Tutorials/AspNetCore-Mvc/Part-I.md
  11. 19
      docs/zh-Hans/docs-nav.json
  12. 1
      templates/mvc/src/MyCompanyName.MyProjectName.Web/MyProjectNameWebModule.cs

3
docs/zh-Hans/Background-Jobs-Hangfire.md

@ -0,0 +1,3 @@
# Hangfire Background Job Manager
待添加

3
docs/zh-Hans/Background-Jobs-RabbitMq.md

@ -0,0 +1,3 @@
# RabbitMQ Background Job Manager
待添加

165
docs/zh-Hans/Background-Jobs.md

@ -1,6 +1,6 @@
## 后台作业
# 后台作业
### 介绍
## 介绍
后台作业用来在后台里执行应用里的一些任务, 出于几个原因, 你可能需要后台工作, 以下是一些例子:
@ -11,14 +11,167 @@
ABP为后台作业提供了一个**抽象**模块和几个后台作业**实现**. 它具有内置/默认的实现以及与Hangfire和RabbitMQ的集成.
### 抽象模块
## 抽象模块
待添加
ABP为后台作业提供了一个 **abstraction** 模块和 **多个实现**. 它有一个内置/默认实现以及Hangfire与RabbitMQ集成.
`Volo.Abp.BackgroundJobs.Abstractions` nuget package 提供了创建后台作业和队列作业所需要的服务. 如果你的模块只依赖这个包,那么它可以独立于其实现/集成.
> `Volo.Abp.BackgroundJobs.Abstractions` package 默认在启动模板中已经安装.
### 创建后台作业
后台作业是一个实现`IBackgroundJob<TArgs>`接口或继承自`BackgroundJob<TArgs>`类的类.`TArgs`是一个简单的C#类, 用于存储作业数据.
在后台发送电子邮件的后台作业例子:
在示例中使用后台作业发送电子邮件,首先定义一个类来存储后台作业的参数
````csharp
public class EmailSendingArgs
{
public string EmailAddress { get; set; }
public string Subject { get; set; }
public string Body { get; set; }
}
````
然后创建后台作业类,它使用 `EmailSendingArgs` 对象发送电子邮件:
````csharp
using Volo.Abp.BackgroundJobs;
using Volo.Abp.Emailing;
namespace MyProject
{
public class EmailSendingJob : BackgroundJob<EmailSendingArgs>
{
private readonly IEmailSender _emailSender;
public EmailSendingJob(IEmailSender emailSender)
{
_emailSender = emailSender;
}
public override void Execute(EmailSendingArgs args)
{
_emailSender.Send(
args.EmailAddress,
args.Subject,
args.Body
);
}
}
}
````
这个作业简单的使用了 `IEmailSender` 发送电子邮件 (请参阅 [邮件发送文档](Emailing.md)).
#### 异常处理
后台作业不应该隐藏异常. 如果它抛出一个异常, 在稍后后台作业将会自动重试. 只有在你不想为当前参数重新运行后台作业时才隐藏异常.
### 队列作业
现在, 你可以使用 `IBackgroundJobManager` 服务向队列中添加一个发送电子邮件作业:
````csharp
public class RegistrationService : ApplicationService
{
private readonly IBackgroundJobManager _backgroundJobManager;
public RegistrationService(IBackgroundJobManager backgroundJobManager)
{
_backgroundJobManager = backgroundJobManager;
}
public async Task RegisterAsync(string userName, string emailAddress, string password)
{
//TODO: 创建一个新用户到数据库中...
await _backgroundJobManager.EnqueueAsync(
new EmailSendingArgs
{
EmailAddress = emailAddress,
Subject = "You've successfully registered!",
Body = "..."
}
);
}
}
````
刚才我们注入 `IBackgroundJobManager` 服务了并且使用它的 `EnqueueAsync` 方法添加一个新的作业到队列中.
Enqueue方法接收一些可选参数用于控制后台作业:
* **priority** 用于控制作业项的优先级. 它接收一个 `BackgroundJobPriority` 类型的枚举,它有 `Low`, `BelowNormal`, `Normal` (默认), `AboveNormal``Hight` 字段.
* **delay** 用于作业第一次重试之前的等待时间 (`TimeSpan`)类型.
### 禁用作业执行
你可能希望在你的应用程序中禁用后台作业执行. 如果你希望在另一个进程中执行后台作业并在当前进程中禁用它,通常可以使用以下命令.
使用 `BackgroundJobOptions` 配置作业执行:
````csharp
[DependsOn(typeof(AbpBackgroundJobsModule))]
public class MyModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
Configure<BackgroundJobOptions>(options =>
{
options.IsJobExecutionEnabled = false; //禁用作业执行
});
}
}
````
> 默认后台管理器(见下文)不支持多进程执行相同的作业队列. 所以, 如果你的应用程序中有多个正在运行的实现,并且使用的是默认的后台管理器, 你应该只在一个应用程序实例进程中启用作业队列.
## 默认后台作业管理器
ABP framework 包含一个简单的 `IBackgroundJobManager` 实现;
- 在**单线程**中**FIFO(先入先出)**.
- **重试**作业执行直到作业**执行成功**或**超时**. 默认作业超时时间是2天. 记录所有异常 .
- 作业执行成功时从存储中(数据库)**删除**作业. 如果超时, 作业会在数据库中被设置为**abandoned**.
- 作业的**重试等待时间会越来越长**. 作业第一次重试等待1分钟, 第二次重试等待2分钟, 第三次重试等待4分钟,以此类推.
- 以固定的时间间隔轮询存储中的作业. 查询作业, 按优先级排序(asc)然后按尝试次数排序(asc).
> `Volo.Abp.BackgroundJobs` nuget package 包含默认的后台作业管理器并且在默认在启动模板中已经安装.
### 配置
在你的[模块类](Module-Development-Basics.md)中使用 `BackgroundJobWorkerOptions` 配置默认作业管理器.
示例中更改后台作业的的超时时间:
````csharp
[DependsOn(typeof(AbpBackgroundJobsModule))]
public class MyModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
Configure<BackgroundJobWorkerOptions>(options =>
{
options.DefaultTimeout = 864000; //10 days (as seconds)
});
}
}
````
### 数据存储
默认的后台作业管理器需要数据存储用来保存和读取作业. 它将 `IBackgroundJobStore` 定义为抽象的. 所以, 如果你想要的话你可以替换它的实现.
后台作业模块使用各种数据访问提供程序实现 `IBackgroundJobStore`. 参阅 [后台工作模块文档](Modules/Background-Jobs.md).
> 默认情况下,后台作业模块已经安装到启动模板中,它基于你的ORM/数据访问选项.
## 集成
后台作业系统是可扩展的,你可以使用自己的实现或预先构建的集成更改默认后台作业管理器.
请参阅预构建的作业管理器备选方案:
待添加
* [Hangfire 后台作业管理器](Background-Jobs-Hangfire.md)
* [RabbitMQ 后台作业管理器](Background-Jobs-RabbitMq.md)

10
docs/zh-Hans/Best-Practices/Application-Services.md

@ -26,6 +26,7 @@
示例:
```c#
[Serializable]
public class IssueDto : FullAuditedEntityDto<Guid>
{
public string Title { get; set; }
@ -34,6 +35,7 @@ public class IssueDto : FullAuditedEntityDto<Guid>
public Collection<IssueLabelDto> Labels { get; set; }
}
[Serializable]
public class IssueLabelDto
{
public Guid IssueId { get; set; }
@ -54,6 +56,7 @@ public class IssueLabelDto
示例:
````C#
[Serializable]
public class IssueWithDetailsDto : FullAuditedEntityDto<Guid>
{
public string Title { get; set; }
@ -62,12 +65,14 @@ public class IssueWithDetailsDto : FullAuditedEntityDto<Guid>
public Collection<LabelDto> Labels { get; set; }
}
[Serializable]
public class MilestoneDto : EntityDto<Guid>
{
public string Name { get; set; }
public bool IsClosed { get; set; }
}
[Serializable]
public class LabelDto : EntityDto<Guid>
{
public string Name { get; set; }
@ -128,6 +133,7 @@ Task<QuestionWithDetailsDto> CreateAsync(CreateQuestionDto questionDto);
输入**DTO**:
````C#
[Serializable]
public class CreateQuestionDto
{
[Required]
@ -181,11 +187,13 @@ Task<int> VoteAsync(Guid id, VoteType type);
* **推荐** 在**应用层**实现应用服务接口.
* **推荐** 使用命名约定. 如: 为 `IProductAppService` 接口创建 `ProductAppService` 类.
* **推荐** 继承自 `ApplicationService` 基类.
* **推荐** 将所有的公开方法定义为 **virtual**, 以便开发人员继承和覆盖它们.
* **不推荐** 定义 **private** 方法. 应该定义为 **protected virtual**, 这样开发人员可以继承和覆盖它们.
#### 使用仓储
* **推荐** 使用专门设计的仓储 (如 `IProductRepository`).
* **不推荐** 使用泛型仓储 (如 `IRepository<Product>`).
* **不推荐** 使用泛型仓储 (如 `IRepository<Product>`).z`
#### 查询数据

3
docs/zh-Hans/Best-Practices/Data-Transfer-Objects.md

@ -4,4 +4,5 @@
* **推荐** 在可能和必要的情况下从预构建的 **基础DTO类** 继承 (如 `EntityDto<TKey>`, `CreationAuditedEntityDto<TKey>`, `AuditedEntityDto<TKey>`, `FullAuditedEntityDto<TKey>` 等).
* **推荐** 定义 **public getter 和 setter** 的DTO成员 .
* **推荐** 使用 **data annotations** **验证** service输入DTO的属性.
* **不推荐** 在DTO中添加任何 **逻辑**, 在必要的时候可以实现 `IValidatableObject` 接口.
* **不推荐** 在DTO中添加任何 **逻辑**, 在必要的时候可以实现 `IValidatableObject` 接口.
* **推荐** 为所有的DTO标记 **[Serializable]** Attribute. 因为它们已经是可序列化的, 开人发员可能会希望进行二进制序列化.

3
docs/zh-Hans/Emailing.md

@ -0,0 +1,3 @@
# Emailing
待添加

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

@ -28,8 +28,6 @@
* ``.Web`` 为是表示层.
* ``.EntityFrameworkCore`` 是EF Core集成.
The solution also contains unit & integration test projects properly configured to work with **EF Core** & **SQLite in-memory** database.
解决方案还包含配置好的的单元&集成测试项目, 以便与 **EF Core****SQLite内存中** 数据库配合使用.
### 创建数据库
@ -44,8 +42,6 @@ The solution also contains unit & integration test projects properly configured
}
````
The solution is configured to use **Entity Framework Core** with **MS SQL Server**. EF Core supports [various](https://docs.microsoft.com/en-us/ef/core/providers/) database providers, so you can use another DBMS if you want.
解决方案使用 **Entity Framework Core****MS SQL Server**. EF Core支持[各种](https://docs.microsoft.com/en-us/ef/core/providers/)数据库提供程序,因此你可以根据实际需要使用其他DBMS.
右键单击`.Web`项目并**设置启动项目**

2
docs/zh-Hans/Index.md

@ -60,6 +60,8 @@
* [捆绑&压缩](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)

3
docs/zh-Hans/Modules/Background-Jobs.md

@ -0,0 +1,3 @@
# Background Jobs Module
待添加

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

@ -295,7 +295,7 @@ successfully created the book with id: f3f03580-c1aa-d6a9-072d-39e75c69f5c7
现在我们来创建一些可见的可用的东西,我们使用[Razor Pages UI](https://docs.microsoft.com/en-us/aspnet/core/tutorials/razor-pages/razor-pages-start)代替经典的MVC.微软也推荐使用Razor Pages UI
`Acme.BookStore.Web`项目的`Pages`文件夹下创建一个新的文件夹叫`Books`并添加一个名叫`Index.html`的Razor Page.
`Acme.BookStore.Web`项目的`Pages`文件夹下创建一个新的文件夹叫`Books`并添加一个名叫`Index.cshtml`的Razor Page.
![bookstore-add-index-page](images/bookstore-add-index-page.png)

19
docs/zh-Hans/docs-nav.json

@ -224,6 +224,25 @@
}
]
},
{
"text": "后台服务",
"items": [
{
"text": "后台作业",
"path": "Background-Jobs.md",
"items": [
{
"text": "Hangfire 集成",
"path": "Background-Jobs-Hangfire.md"
},
{
"text": "RabbitMQ 集成",
"path": "Background-Jobs-RabbitMq.md"
}
]
}
]
},
{
"text": "测试"
},

1
templates/mvc/src/MyCompanyName.MyProjectName.Web/MyProjectNameWebModule.cs

@ -130,6 +130,7 @@ namespace MyCompanyName.MyProjectName
options.Languages.Add(new LanguageInfo("en", "en", "English"));
options.Languages.Add(new LanguageInfo("pt-BR", "pt-BR", "Português"));
options.Languages.Add(new LanguageInfo("tr", "tr", "Türkçe"));
options.Languages.Add(new LanguageInfo("zh-Hans", "zh-Hans", "简体中文"));
});
}

Loading…
Cancel
Save