天天看点

ASP.NET ZERO 学习 —— (7) 开发手册之基础架构动态Web API层本地化EF框架整合授权功能设置导航缓存和Redis缓存后台任务和HANGFIRESignalR 集成日志DTO映射邮件发送二进制对象管理软删除打包和压缩基类CSRF/XSRF 保护版本控制

动态Web API层

SPA(单页面应用)和MPA(多页面应用)都使用AJAX来提供更好的用户体验,他们通过AJAX调用应用服务。因此有必要创建一个Web API Controller作为适配器(客户端通过AJAX调用Web API Controller的action,然后调用应用服务的方法)

ABP框架使用应用服务接口定义自动创建动态Web API层,这里实际上没有Web API Controller。在.WebApi项目的 WebApiMoudule中创建动态Web API Controller。见动态Web API 层文档了解更多。

当ABP动态创建Web API Controller时,你也可以创建regular Web API Controller。

本地化

ASP.NET Zero 用户接口完全本地化。ASP.NET Zero 使用动态的,基于数据库的,每个租户的本地化。

xml文件用作所需语言的基础翻译:

ASP.NET ZERO 学习 —— (7) 开发手册之基础架构动态Web API层本地化EF框架整合授权功能设置导航缓存和Redis缓存后台任务和HANGFIRESignalR 集成日志DTO映射邮件发送二进制对象管理软删除打包和压缩基类CSRF/XSRF 保护版本控制

你可以通过拷贝并翻译来添加更多的所需语言xml文件。需要注意的是xml文件应该是一个嵌入式资源。

当你在默认语言对应的xml文件中添加了一个新的本地化文本片段,那么也应该对其他语言版本的xml文件做相应的添加。没有必要将它添加到数据库迁移代码中,因为xml文件中的值将用作默认值。

应用语言在 DefaultLanguagesCreator 类中定义,这被作为Entity Framework 数据迁移的种子数据。所以,你想添加一种新的语言,只需要将他添加至 DefaultLanguagesCreator 类里即可。此外,您也可以添加相应的XML文件作为应用的默认语言。

见本地化和语言管理了解更多。

EF框架整合

ASP.NET Zero使用了EF的code-first和migrations。XXXXDbContext(XXXX为你的项目名字)定义了DbContext类。Migration文件夹包含了EF的Migrations。

XXXXRepositoryBase 类作为自定义仓储类的基类。见EF框架整合了解更多。

授权

授权系统基于权限,AppPermissions 包含权限常量名,AppAuthorizationProvider 定义了系统中所有的权限。

见授权了解如何配置权限。

功能

AppFeatureProvider 为多租户应用定义功能。功能的名字作为常量在AppFeatures 中定义。

见功能管理学习如何定义和使用功能。

设置

所有的设置都有一个唯一的名字。AppSettings 类中定义了设置的常量名。所有设置和他们的默认值都在 AppSettingProvider 类中定义。

见设置了解更多。

导航

菜单是通过定义在AppNavigationProvider 类中自动生成的。你有两个菜单:Main(Angular应用中的主菜单)和FrontEnd(前端网站的主菜单)。

见导航了解更多。

缓存和Redis缓存

ASP.NET Zero 目前只使用到Redis来作为内存缓存。如果你想启用它,只需要在WebModule中将下面的代码取消注释即可(在.Web项目中的App_Start文件夹中)

见缓存了解更多。

后台任务和HANGFIRE

ABP框架包含background job system作为默认后台作业管理器。如果你想使用Hangfire作为后台作业管理器,你也可以很简单的启用它。

首先,在WebModule取消注释以下代码(在.Web项目中的App_Start文件夹中)

Configuration.BackgroundJobs.UseHangfire(configuration =>
{
    configuration.GlobalConfiguration.UseSqlServerStorage("Default");
});
           

如果要启用Hangfire仪表盘,在Startup.cs文件中取消注释以下代码(在.Web项目中的App_Start文件夹中)

注意:Hangfire在数据库中创建了独立的表。见后台任务和Hangfire集成了解更多

SignalR 集成

SignalR 在启动模板中已进行了配置和集成,即时通知系统将会用到它。你可以直接在应用中直接使用SignalR。见SignalR集成了解更多。

日志

ASP.NET Zero用 log4net 作为默认的日志组件,配置信息在.Web项目的log4net.config文件中。它默认将所有的日志写入网站Logs文件夹中。当你发布你的项目时,记住将Logs文件夹配置写权限。

见日志文档了解如何注入ILogger和写日志。

DTO映射

ASP.NET Zero使用AutoMapper作为DTO和实体类的映射(和其他类型对象到对象的映射)。使用Abp.AutoMapper类库就是使用了AutoMapper。

下面的DTO类被用来转换租户的编辑信息

[AutoMap(typeof (Tenant))]
public class TenantEditDto : EntityDto
{
    [Required]
    [StringLength(Tenant.MaxTenancyNameLength)]
    public string TenancyName { get; set; }

    [Required]
    [StringLength(Tenant.MaxNameLength)]
    public string Name { get; set; }

    public bool IsActive { get; set; }
}
           

这里,AutoMap属性动态的创建了TenantEditDto和Tenant的映射,然后你可以按下面的方式将Tenant对象转换成TenantEditDto对象。

[AbpAuthorize(AppPermissions.Pages_Tenants_Edit)]
public async Task<TenantEditDto> GetTenantForEdit(EntityRequestInput input)
{
    return (await TenantManager.GetByIdAsync(input.Id)).MapTo<TenantEditDto>();
}
           

MapTo方法执行映射。

自定义对象映射

在某些情况下,基于属性的映射可能不够,你可以在CustomDtoMapper 类中直接使用AutoMapper API来配置你自己的映射。

见数据传输对象了解更多DTOs信息。

邮件发送

ASP.NET Zero在某些情况下会想用户发送邮件(例如,忘记密码和邮件确认)。邮件模板定义放在.Core项目的Emailing/EmailTemplates文件夹下(default.html),你可以通过编辑该文件来更改你的邮件模板。

邮件发送在调试模式下是被禁用的,这是因为在开发中可能不会配置邮件发送的相关属性。如果你需要你可以启用它。在发布模式下它是被启用的。如果你愿意,你可以在XXXXCoreModule 类的PreInitialize 方法里来更改它。

二进制对象管理

用户头像被存放在数据库里,而不是存放在文件系统里。但是因为性能原因,它不是存放在用户表里(用户信息会很频繁的从数据库中检索,但用户头像很少需要)。

在ASP.NET Zero里构建了个通用的二进制文件存储机制:BinaryObject实体可以用于保存任何类型的二进制对象(byte数组)。由于用户头像可以被转换成byte数组,因此用户头像就被存放在这里。

IBinaryObjectManager 接口定义了Save, Get和Delete 二进制对象的方法。DbBinaryObjectManager 实现了将二进制对象保存进数据库。例如,ProfileController 使用了IBinaryObjectManager 接口来从数据库获取用户头像。

你也可以通过来实现IBinaryObjectManager接口,以另一种方式让文件存放在其他地方。

软删除

从数据库中删除实体,一般都使用软删除模式,仅将其标记为“删除”。因此,一个实体被软删除,那么它不会被应用检索到。利用ABP的Data filters将其过滤。

ASP.NET Zero里,许多实体都可以被软删除。见ABP的数据过滤了解更多。

打包和压缩

ASP.NET Zero使用ASP.NET Optimization来进行打包和压缩脚本和样式文件。打包定义在不同的文件里:

- AppBundleConfig 用来对SPA文件进行打包

- MpaBundleConfig 用来对MPA文件进行打包

- FrontEndBundleConfig 用来对前台文件进行打包

- CommonBundleConfig 用来一些通用资源文件进行打包

另外,参见 ScriptPaths 和 StylePaths 类,他们包含了JS和CSS文件的位置常量。

基类

在应用里会用到许多有用的基类

- XXXXAppServiceBase : application services 的基类

- XXXXDomainServiceBase : domain services 的基类

- XXXXControllerBase : ASP.NET MVC Controllers 的基类

- XXXXWebViewPageBase : ASP.NET MVC Views的基类。实际上,所有视图将自动的继承该基类,你可以添加一些通用的属性或方法在所有视图中使用。

- XXXXServiceBase : 其他服务类的基类。例如,UserEmailer 类。

- XXXXRepositoryBase : 自定义仓储的基类

- XXXXApiControllerBase : regular Web API Controllers 的基类

强烈建议继承这些类中的一个,因为它们确实使日志、本地化、授权等更容易

CSRF/XSRF 保护

ABP框架尽可能多的提供了简单和自动化的CSRF保护。ASP.NET Zero模板预配置了CSRF保护。见ABP的CSRF/XSRF 保护了解更多。

版本控制

AppVersionHelper 类用来定义应用的当前版本。当你在这里改变了版本,应用里的所有项目的版本都将被改变。此外,版本和发布日期将自动显示在应用程序页的左下角。这样,你总是可以看到当前运行的应用版本。

继续阅读