ASP.NET ZERO 学习 —— (7) 开发手册之基础架构
#动态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文件用作所需语言的基础翻译:
你可以通过拷贝并翻译来添加更多的所需语言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文件夹中)
Configuration.Caching.UseRedis();
见缓存了解更多。
#后台任务和HANGFIRE
ABP框架包含background job system作为默认后台作业管理器。如果你想使用Hangfire作为后台作业管理器,你也可以很简单的启用它。
首先,在WebModule取消注释以下代码(在.Web项目中的App_Start文件夹中)
Configuration.BackgroundJobs.UseHangfire(configuration =>
{configuration.GlobalConfiguration.UseSqlServerStorage("Default");
});
如果要启用Hangfire仪表盘,在Startup.cs文件中取消注释以下代码(在.Web项目中的App_Start文件夹中)
app.UseHangfireDashboard();
注意: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 GetTenantForEdit(EntityRequestInput input)
{return (await TenantManager.GetByIdAsync(input.Id)).MapTo();
}
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来进行打包和压缩脚本和样式文件。打包定义在不同的文件里:
另外,参见 ScriptPaths 和 StylePaths 类,他们包含了JS和CSS文件的位置常量。
#基类
在应用里会用到许多有用的基类
强烈建议继承这些类中的一个,因为它们确实使日志、本地化、授权等更容易
#CSRF/XSRF 保护
ABP框架尽可能多的提供了简单和自动化的CSRF保护。ASP.NET Zero模板预配置了CSRF保护。见ABP的CSRF/XSRF 保护了解更多。
#版本控制
AppVersionHelper 类用来定义应用的当前版本。当你在这里改变了版本,应用里的所有项目的版本都将被改变。此外,版本和发布日期将自动显示在应用程序页的左下角。这样,你总是可以看到当前运行的应用版本。
标签:
相关文章
-
无相关信息