下载自:https://github.com/aspnetboilerplate/module-zero
打开D:\ABP\module-zero-master\sample里的ModuleZeroSampleProject.sln项目文件,马上还原程序包,试图update-database,报错,说没这个命令。
网上搜了半天,才看到解决方法:
输入set-executionpolicy remotesigned
再输入:
PM> Import-Module D:\ABP\module-zero-master\sample\packages\EntityFramework.6.1.3\tools\EntityFramework.psd1
PM> update-database
终于搞定。
(奇怪的是,重新解压,直接编译,让VS自动还原程序包,就不会出现上面的问题,直接update-database通过)
还有就是别手痒,去更新程序包,我下载的项目里还使用jquery-2.1.3.min.js,一更新就被换成jquery-2.1.4.min.js,但是BundleConfig类里还是2.1.3,没有改2.1.4啊…………
启动ModuleZeroSampleProject.Web项目,使用admin/123qwe登录没有问题。但是如果无输入、乱输入,则没有任何错误提示。
参考http://qasample.aspnetboilerplate.com/示例网站,分明是有错误提示的嘛:
原来还得改Web.config:
<customErrors mode="On" />
一个典型的ABP项目:
先看Core项目下的实体:
用户:
User继承的是AbpUser<Tenant, User>
UserManager继承的是AbpUserManager<Tenant, Role, User>
UserStore继承的是AbpUserStore<Tenant, Role, User>
这几个类实际上并无增加内容,仅仅是直接继承而已。需要注意的是User所继承的AbpUser<Tenant, User>使用了子类User作为TUser
角色:
Role继承的是AbpRole<Tenant, User>
RoleStore继承的是AbpRoleStore<Tenant, Role, User>
RoleManager继承的是AbpRoleManager<Tenant, Role, User>
PermissionChecker继承的是PermissionChecker<Tenant, Role, User>
同样,这些子类都没有增加内容。
租户:
Tenant继承的是AbpTenant<Tenant, User>
问题和回答:
Question继承了CreationAuditedEntity<int, User>,表明这个类要求包含创建者信息,后面可以看到需要使用到它的CreatorUser属性。
在数据表Questions里能够发现:
这个字段并没有在Question类里出现,要在CreationAuditedEntity里找:
因为问题和回答是一对多关系,所以有属性:
public virtual ICollection<Answer> Answers { get; set; }
Answer也继承了CreationAuditedEntity<int, User>
注意到有属性IsAccepted
领域服务:QuestionDomainService,继承了DomainService类
这个服务就是放“接受答案”方法的地方:
就是如果已有接受的答案,则找出来,设置为非接受,然后设置传入的答案为已接受。
注意在这个类已经使用了IRepository<Answer>
再看ModuleZeroSampleProject.EntityFramework项目下的ModuleZeroSampleProjectDbContext类
继承的是AbpZeroDbContext<Tenant, Role, User>
声明了:
public virtual IDbSet<Question> Questions { get; set; }
public virtual IDbSet<Answer> Answers { get; set; }
但是查看数据库,数据表可不止这两个。
再看ModuleZeroSampleProject.Application项目:
ModuleZeroSampleProjectAuthorizationProvider类,继承AuthorizationProvider,声明了几个权限:
创建问题、删除问题、删除答案、回答问题。
设置类MySettingProvider,继承SettingProvider,设置了一页显示10条问题。
IUserAppService声明了GetUsers方法,也就是用户列表。
IQuestionAppService声明了
GetQuestions获得所有问题
CreateQuestion创建问题
GetQuestion获取一个问题
VoteUp加1投票
VoteDown减1投票
SubmitAnswer回答问题
AcceptAnswer接受答案
再看实现:QuestionAppService类
GetQuestions方法中,读取了MySettingProvider里的配置:
input.MaxResultCount = SettingManager.GetSettingValue<int>(MySettingProvider.QuestionsDefaultPageSize);
获取问题列表,需要注意输入的参数为GetQuestionsInput对象,该对象实现了IPagedResultRequest、ISortedResultRequest
看表达式
需要知道,Question类继承了CreationAuditedEntity<int, User>,因而具有CreateUser属性。
这里使用了EF里扩展的Include方法,要求根据外键CreatorUserID来加载创建者
PageBy方法是ABP扩展的一个分页方法。
另外要注意的是automapping:
[AutoMapFrom(typeof(Question))]
public class QuestionDto : CreationAuditedEntityDto
QuestionDto 类只有CreatorUserName属性,而没有CreatorUserID属性,但是还能映射:
Items = questions.MapTo<List<QuestionDto>>()
CreateQuestion方法:
可以看到CreateQuestion方法前,加了[AbpAuthorize("CanCreateQuestions")] 特性,对权限的验证非常便捷。
异步插入数据的写法:
GetQuestion方法:
跨表查询好狠:
var question =
_questionRepository
.GetAll()
.Include(q => q.CreatorUser)
.Include(q => q.Answers)
.Include("Answers.CreatorUser")
.FirstOrDefault(q => q.Id == input.Id);
SubmitAnswer方法:
使用了 _unitOfWorkManager.Current.SaveChanges();
AcceptAnswer方法:
直接调用了领域服务:_questionDomainService.AcceptAnswer(answer)
再看Tests项目对上面服务方法的测试,首先进行注入:
声明一个继承于AbpIntegratedTestBase的类SampleProjectTestBase,其构造函数
具体的测试类如UserAppService_Tests,需要继承SampleProjectTestBase
重新生成,就可以运行测试了:
Web项目,AccountController类,注意到使用了UserManager、AuthenticationManager
通过HttpContext.GetOwinContext().Authentication获取AuthenticationManager,使用了Owin
UserManager是通过AccountController的构造函数传入的,前者的父类有实现ITransientDependency,所以这里会被自动注入。
使用:
var loginResult = await _userManager.LoginAsync(
loginModel.UsernameOrEmailAddress,
loginModel.Password,
loginModel.TenancyName
);
LoginAsync方法:
public virtual Task<AbpUserManager<TTenant, TRole, TUser>.AbpLoginResult> LoginAsync(string userNameOrEmailAddress, string plainPassword, string tenancyName = null)
这方法需要去zero的源码里研究
AuthenticationManager可直接使用其SignIn、SignOut方法:
AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);
AuthenticationManager.SignIn(new AuthenticationProperties { IsPersistent = loginModel.RememberMe }, loginResult.Identity);
HomeController加了 [AbpMvcAuthorize]特性。
Startup类可以看到配置,[assembly: OwinStartup(typeof(Startup))]
在Configuration方法里
public void Configuration(IAppBuilder app)
{
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/Login")
});
app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);
}
}
详情参考文章
- ABP 极简入门教程(一)
本示例不讲概念,只讲怎么用,概念性的内容没有比官方文档更清楚的了,我也正在学习,可能理解的地方有不对的欢迎一起交流,但需要您了解以下内容才能看明白 asp.net core Entity Framew ...
- abp zero sample
测试运行地址:http://ghy.demo.aspnetzero.com 账号:admin 密码:123456 需要源码,请加QQ:858-048-581 一.用户管理 二.日志记录 1.先编译成 ...
- ABP文档 - 本地化
文档目录 本节内容: 简介 应用语言 本地化源 XML文件 注册XML本地化源 JSOn文件 注册JSON本地化源 资源文件 自定义源 获取一个本地文本 在服务端 在MVc控制器里 在MVC视图里 在 ...
- ABP文档 - 异常处理
文档目录 本节内容: 简介 启用错误处理 非AJAX请求 显示异常 UserFriendlyException Error 模型 AJAX 请求 异常事件 简介 这个文档针对Asp.net Mvc和W ...
- ABP(现代ASP.NET样板开发框架)系列之8、ABP日志管理
点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之8.ABP日志管理 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)” ...
- ABP(现代ASP.NET样板开发框架)系列之23、ABP展现层——异常处理
点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之23.ABP展现层——异常处理 ABP是“ASP.NET Boilerplate Project (ASP.NET ...
- ABP框架 - 日志
文档目录 本节内容: 服务端 获取Logger(记录器) Logger的基类 配置 Abp.Castle.Log4Net 包 客户端 服务端 ABP使用Castle Windsor的日志记录工具,它可 ...
- ABP框架 - 功能管理
文档目录 本节内容: 简介 关于 IFeatureValueStore 功能类型 Boolean 功能 Value 功能 定义功能 基本功能属性 其它功能属性 功能层次 检查功能 使用Requires ...
- Abp集成Swagger的最佳实践
1.在项目中添加nuget包 Abp.Web.Api.SwaggerTool 2.在项目Abp模块的DependsOn添加AbpWebApiSwaggerToolModule Run It,启动项目, ...
随机推荐
- fedora 配置
静态ip配置 vi /etc/sysconfig/network-scripts/ifcfg-ens33 [root@localhost network-scripts]# cat ifcfg-ens ...
- 黄聪:PHP7.0中htmlspecialchars出错解决方案(wordpress)
htmlspecialchars( $context, ENT_COMPAT, 'UTF-8' )
- 移动端line-height失效
移动端高度过小,使用rem布局时div里面的文字不能用line-height垂直居中: 解决方案,先高度,字体大小扩大n倍,然后利用transform:scale(0.n)缩小即可.
- JavaScript笔记杂谈篇(啥都有)
二维码缩放比例以43PX的倍数缩放最为标准. NuGet相关管理http://www.cnblogs.com/dudu/archive/2011/07/15/nuget.html 学习笔记: http ...
- lua 基础库
数学库: 三角函数:math.sin, math.cos, math.tan, math.asin, math.acos 都以弧度为单位: 指数和对数函数:exp, log, log10: 取整函数: ...
- DEV中dx:ASPxPopupControl 控件的使用(在窗口关闭或隐藏时,清楚文本框中的内容)
//在窗口关闭或隐藏时,清楚文本框中的内容(核心代码) function(s, e) { ASPxClientEdit.ClearGroup('entryGroup'); } <asp:Cont ...
- 纸上谈兵:AVL树
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 二叉搜索树的深度与搜索效率 我们在树, 二叉树, 二叉搜索树中提到,一个有n个节点 ...
- 一千行MySQL学习笔记
以下为本人当年初学MySQL时做的笔记,也从那时起没再更新过,但还是囊括了基本的知识点,有时还翻出来查查.是不是干货,就看亲们了~ 如果哪天笔记有更新了,我还是会更新该文章滴,其实笔记已经放到了Git ...
- threadlocal类
1.threadlocal对象为线程提供变量的副本,该副本为线程私有的,其它线程访问不到: 2.变量的副本存储在ThreadLocalMap对象中: 3.使用threadlocal时候,最好先使用in ...
- 30. PL/SQL Developer连接服务器查询时,数据乱码处理
在windows中创 建一个名为“NLS_LANG”的系统环境变量,设置其值为"AMERICAN_AMERICA.ZHS16GBK", NLS_LANG的值为:select u ...