文章目录

  • ABP
  • 本系列学习日志
  • AutoMaper
    • 坑1
    • 坑2(这个不算坑)
  • Application
    • 坑1
    • 坑2

ABP

学习abp的最好的网站(官网)

本系列学习日志

abp学习日记 初记
abp学习日记一(安装)
abp学习日志二(DDD)
abp学习日志三(实体&聚合根)
abp学习日志四(仓储)
abp学习日志五(领域服务)
abp学习日志六(模块化开发)
abp学习日志七(动态API)
abp学习日志八(多租户)
abp学习日志九(总结)

AutoMaper

abp支持从Service映射到API,在Service 中有一个CurdAppService的泛型类,泛型类用到了几个参数
代码如下
(举例代码)

/*SystemApp:集合跟(实体)
*SystemAppDto:查询结果dto
*Guid:Key
*PagedAndSortedResultRequestDto:abp给的默认分页排序查询RequestDto
*CreateSystemAppDto:创建对象的Dto
*UpdateSystemAppDto:更新对象的Dto
*/public class SystemAppService : CrudAppService<SystemApp, SystemAppDto, Guid, PagedAndSortedResultRequestDto, CreateSystemAppDto, UpdateSystemAppDto>, ISystemAppService{private readonly IRepository<SystemApp, Guid> productRepository;private readonly ICurrentTenant currentTenant;public SystemAppService(IRepository<SystemApp, Guid> productRepository, ICurrentTenant currentTenant) : base(productRepository){this.productRepository = productRepository;this.currentTenant = currentTenant;}}

看到上面的代码有那么多Dto,dto和聚合根(实体)是如何实现属性对应的呢?Abp使用的是AutoMap。
使用方法就是在项目中(Application项目)有一个XXXXAutoMapperProfile.cs的文件,直接在这里面写上
CreateMap<SystemApp,SystemAppDto>()
如果需要更多那就都写上。

官方文档也是这样说的。

坑1

如果你的项目使用的是Module模板,并且是2.2.1以上的版本,请注意,不能使用默认的,除非你的Dto和实体的属性丝毫不差,否则会出现异常。

  • 请添加参数 MemberList.None。关于MemberList枚举类型有三个值,有兴趣可以都试试

坑2(这个不算坑)

如果项目存在很多个Dto和实体,那么写Create会写到怀疑人生。可以试试反射,反射的前提是做好namespace,否则反射的方法写起来比较麻烦,我的namespace规则,Dto都在XXXx.Dto命名空间。我的聚合根都在XXX.Model命名空间。

 public VShopApplicationAutoMapperProfile(){/* You can configure your AutoMapper mapping configuration here.* Alternatively, you can split your mapping configurations* into multiple profile classes for a better organization. */var types = Assembly.Load("xxxr.xxx.Application.Contracts").GetTypes();var domainTypes = Assembly.Load("xxx.xxx.Domain").GetTypes();foreach (var type in types){if (type.Namespace == "xxx.xxx.Dto"){if (type.Name.StartsWith("Create") || type.Name.StartsWith("Update")){var domainTypeName = type.Name.Replace("Create", "").Replace("Update", "").Replace("Dto", "");if (domainTypes.Any(t => t.Name == domainTypeName))CreateMap(type, domainTypes.First(t => t.Name == domainTypeName), MemberList.None);}else{var domainTypeName = type.Name.Replace("Dto", "");if (domainTypes.Any(t => t.Name == domainTypeName))CreateMap(domainTypes.First(t => t.Name == domainTypeName), type, MemberList.None);}}}}

Application

为什么会定位到这个项目呢,因为错误是发生在Service里面的。错误内容如下

2020-03-29 11:25:38.867 +08:00 [ERR] {"code": null,"message": "对不起,在处理你的请求期间,产生了一个服务器内部错误!","details": null,"validationErrors": null
}
2020-03-29 11:25:38.868 +08:00 [ERR] An exception was thrown while activating Castle.Proxies.SystemRoleServiceProxy.
Autofac.Core.DependencyResolutionException: An exception was thrown while activating Castle.Proxies.SystemRoleServiceProxy.---> Autofac.Core.DependencyResolutionException: None of the constructors found with 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder' on type 'Castle.Proxies.SystemRoleServiceProxy' can be invoked with the available services and parameters:
Cannot resolve parameter 'Volo.Abp.Domain.Repositories.IRepository`2[Sugar.VShop.Model.SystemRole,System.Guid] productRepository' of constructor 'Void .ctor(Castle.DynamicProxy.IInterceptor[], Volo.Abp.Domain.Repositories.IRepository`2[Sugar.VShop.Model.SystemRole,System.Guid], Volo.Abp.MultiTenancy.ICurrentTenant)'.at Autofac.Core.Activators.Reflection.ReflectionActivator.GetValidConstructorBindings(IComponentContext context, IEnumerable`1 parameters)at Autofac.Core.Activators.Reflection.ReflectionActivator.ActivateInstance(IComponentContext context, IEnumerable`1 parameters)at Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable`1 parameters, Object& decoratorTarget)--- End of inner exception stack trace ---at Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable`1 parameters, Object& decoratorTarget)at Autofac.Core.Resolving.InstanceLookup.Execute()at Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, IComponentRegistration registration, IEnumerable`1 parameters)at Autofac.Core.Resolving.ResolveOperation.ResolveComponent(IComponentRegistration registration, IEnumerable`1 parameters)at Autofac.Core.Resolving.ResolveOperation.Execute(IComponentRegistration registration, IEnumerable`1 parameters)at Autofac.Core.Lifetime.LifetimeScope.ResolveComponent(IComponentRegistration registration, IEnumerable`1 parameters)at Autofac.ResolutionExtensions.TryResolveService(IComponentContext context, Service service, IEnumerable`1 parameters, Object& instance)at Autofac.ResolutionExtensions.ResolveService(IComponentContext context, Service service, IEnumerable`1 parameters)at Autofac.ResolutionExtensions.Resolve(IComponentContext context, Type serviceType, IEnumerable`1 parameters)at Autofac.ResolutionExtensions.Resolve(IComponentContext context, Type serviceType)at Autofac.Extensions.DependencyInjection.AutofacServiceProvider.GetRequiredService(Type serviceType)at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType)at Microsoft.AspNetCore.Mvc.Controllers.ServiceBasedControllerActivator.Create(ControllerContext actionContext)at Microsoft.AspNetCore.Mvc.Controllers.ControllerFactoryProvider.<>c__DisplayClass5_0.<CreateControllerFactory>g__CreateController|0(ControllerContext controllerContext)at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync()
--- End of stack trace from previous location where exception was thrown ---at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextExceptionFilterAsync>g__Awaited|25_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)

大致的意思就是无法反射出对应的构造函数。

网上找到了一个文章很有启发意义 https://www.codetd.com/article/7994226

这个文章的意思是说没有做DbSet 导致实体无法映射,也就是说聚合根对应的仓储无法反射,这个倒是挺符合道理的。

但是同样的代码放到 有UI的项目下可用,放到–no-ui的项目下不可用。

坑1

填坑。
需要在EntityFramework项目中添加如下代码

namespace Sugar.VShop.EntityFrameworkCore
{[DependsOn(typeof(VShopDomainModule),typeof(AbpEntityFrameworkCoreModule))]public class VShopEntityFrameworkCoreModule : AbpModule{public override void ConfigureServices(ServiceConfigurationContext context){context.Services.AddAbpDbContext<VShopDbContext>(options =>{//这里是需要添加的代码options.AddDefaultRepositories();/* Add custom repositories here. Example:* options.AddRepository<Question, EfCoreQuestionRepository>();*/});}public override void OnApplicationInitialization(ApplicationInitializationContext context){base.OnApplicationInitialization(context);}}
}

因为abp的模板文件就是添加到这里的,但是这个不合理,所以我把这段代码添加到了启动项目下。

坑2

不要让Service中包含App或者Application等关键字,比如有个服务叫SystemAppService,映射到API后会没有APP关键字,直接变成了XXX/System/{1}

https://www.codetd.com/article/7994226

abp学习日志九(总结)相关推荐

  1. PostgreSQL学习的九层宝塔

    活动预告:在即将到来的 2019 数据技术嘉年华大会上,来自 PostgreSQL 方面的主题同样丰富多彩,既有来自云厂商的数据库研发成果,新版本新特性介绍,还有来自于用户的最佳实践. 这些主题包括来 ...

  2. Python学习日志16 - 数据库SQL查询

    Python学习日志 RBHGO的主页欢迎关注 温馨提示:创作不易,如有转载,注明出处,感谢配合~ 目录 文章目录 Python学习日志 目录 Python学习日志16课 - 数据库SQL查询 DQL ...

  3. 我的游戏学习日志5——拳皇97_(不得不吹的经典)

    我的游戏学习日志5--拳皇97_(不得不吹的经典) <拳皇97>是由日本SNK公司于1997年发行的一款街机格斗游戏,经典中的经典,通关版中格斗队伍共分为九组以及单人的八神庵.矢吹真吾加七 ...

  4. Abp学习笔记---轻松搞懂模块

    做.net开发的朋友或多或少都听说过这个框架,自己在差不多一年前也才开始听说,但是!!!之前也没太当回事,一来是工作项目上用不着,二来以为到时候需要用的时候再拿来用就好了. 现在看来却是大错特错!近段 ...

  5. Python学习日志04 - 列表

    Python学习日志 RBHGO的主页欢迎关注 温馨提示:创作不易,如有转载,注明出处,感谢配合~ 目录 文章目录 Python学习日志 目录 第04课:Python的容器型数据类型 进入今天的正题 ...

  6. HTML5 Canvas 学习日志(三)

    2019独角兽企业重金招聘Python工程师标准>>>  HTML5 Canvas 学习日志(三) Canvas的11种合成 蓝色为destination,粉色为source 1 ...

  7. Maven学习总结(九)——使用Nexus搭建Maven私服

    2019独角兽企业重金招聘Python工程师标准>>> Maven学习总结(九)--使用Nexus搭建Maven私服 一.搭建nexus私服的目的 为什么要搭建nexus私服,原因很 ...

  8. IOS学习笔记(九)之UIAlertView(警告视图)和UIActionSheet(操作表视图)基本概念和使用方法...

    IOS学习笔记(九)之UIAlertView(警告视图)和UIActionSheet(操作表视图)基本概念和使用方法 Author:hmjiangqq Email:jiangqqlmj@163.com ...

  9. .NetCore微服务Surging新手傻瓜式 入门教程 学习日志---结构简介(二)

    .NetCore微服务Surging新手傻瓜式 入门教程 学习日志---结构简介(二) 原文:.NetCore微服务Surging新手傻瓜式 入门教程 学习日志---结构简介(二) 先上项目解决方案图 ...

最新文章

  1. extra加ing_英语词汇学各个章节的内容
  2. 红曲面怎么做_「曲面建模」CREO陶瓷小摆件的曲面建模,怎么样分析和拆解面...
  3. mysql半同步复制实现
  4. PyTorch 之 requires_grad,requires_grad_(),grad_fn
  5. kettle怎么复制资源库的job_#linux系统下调度数据库类型资源库中的kettle job
  6. Python计算斐波那契数列
  7. android 语音库,安卓系统也能用苹果语音库:Vocalizer TTS语音引擎及语音包合集
  8. SDR WiFi平台 gr-ieee802-11 软件无线电实现802.11协议
  9. 泛微OA常用js代码块
  10. 6个html5手机游戏源码,html5逗你玩手机游戏源码
  11. cs起源 css武器大合集,cs起源幻彩武器包mod
  12. CTPN论文翻译——中英文对照
  13. 海外自媒体多账号运营注意事项看这里!
  14. linux常用命令语句(全)
  15. 如何同时对多个 Word 的内容进行批量替换
  16. 评分卡实例:一步一步实现评分卡(详细长文)
  17. Animation动画学习
  18. 身份证OCR识别是什么?
  19. ps利用色环手工给图片进行局部调色,一看就懂
  20. 如何获取本机电脑的AD域名称

热门文章

  1. 中望cad自定义快捷键命令_中望CAD自定义设置.doc
  2. IntelliJ IDEA 日常使用介绍
  3. 国际象棋java_国际象棋源代码-JAVA
  4. 等保测评(windows)
  5. numpy多维数组获取指定矩形区域
  6. Excel-VBA应用(1):批量提取单元格中的超链接URL
  7. 【前端】JavaScript-节点操作
  8. 使用微信小程序扫码登录系统PC端web的功能
  9. 银河麒麟V10业务系统适配记录 处理器:FT2000+ 中国信创服务社区
  10. 小白兔写话_二年级写话小白兔