[Practice Note] 4.Abp入门:应用层实现简单的业务操作以及工作单元使用

ABP 入门系列:学习 ABP 框架的实际操作演练(使用 C#) 在 ABP 中,实体是应用程序的核心组成部分之一。我们将创建一个简单的实体,以便演示 ABP 的功能。在解决方案资源管理器中,右键单击 “应用程序” 项目,然后选择 “添加” -> “新建项”。选择 “类” 模板,并命名为 “Book.cs”。set;get;set;get;set;get;set;} } }get;set;get;set;get;set;get;set; 阅读详情

Demo项目地址:https://download.youkuaiyun.com/download

Abp框架应用层动态生成Webapi

接口与实现类必须以 xxxxAppService结尾

在应用层定义Dto模型与接口类,实现类

接口、实现类中涉及的实体参考:https://mp.youkuaiyun.com/postedit/102721001
MainConferenceDto.cs

namespace ABPTest.Dto
{
    [AutoMapFrom(typeof(MainConference.MainConference))]  //abp自动映射,完成实体到Dto模型的映射
    public class MainConferenceDto:EntityDto<Guid>
    {
        public string Name { get; set; }
        public string Address { get; set; }
        public string ReMark { get; set; }
        public int Status { get; set; }
    }
}

CommonSearch.cs

namespace ABPTest.Dto
{
    public class CommonSearch:EntityDto   //继承默认加入Id字段
    {
        public int? PageSize { get; set; }
        public int? PageIndex { get; set; }
        public int state { get; set; }
    }
}

IMainconferenceAppService.cs

namespace ABPTest.Conference
{
    public interface IMainconferenceAppService:IApplicationService
    {
        /// <summary>
        /// 新增会议
        /// </summary>
        /// <param name="con"></param>
        /// <returns></returns>
        bool AddMainConference(MainConferenceDto con);
        /// <summary>
        /// 修改会议
        /// </summary>
        /// <param name="name">会议名</param>
        /// <returns></returns>
        bool EditMainConference(string name);
        /// <summary>
        /// 条件筛选会议数据
        /// </summary>
        /// <param name="s"></param>
        /// <returns></returns>
        List<MainConferenceDto> GetConferenceList(CommonSearch s);
        /// <summary>
        /// 获取所有会议
        /// </summary>
        /// <returns></returns>
        List<MainConferenceDto> GetAllConference();
        /// <summary>
        /// 删除会议
        /// </summary>
        /// <param name="name">会议名</param>
        /// <returns></returns>
        bool DeleteConference(string name);

        /// <summary>
        /// 新增 修改操作会议,工作单元示例
        /// </summary>
        /// <returns></returns>
        bool InsertAndUpdate();
    }
}

MainconferenceAppService .cs

namespace ABPTest.Conference
{
    /// <summary>
    /// 
    /// </summary>
    ///
    [AbpAuthorize]    //授权
    public class MainconferenceAppService : ABPTestAppServiceBase, IMainconferenceAppService
    {
        /// <summary>
        /// 主会议repository
        /// </summary>
        public IRepository<MainConference.MainConference,Guid> _repository;
        /// <summary>
        /// 分会议repository
        /// </summary>
        public IRepository<SubConference.SubConference, Guid> _subconferencerepository;
        /// <summary>
        /// abp工作单元
        /// </summary>
        public IUnitOfWorkManager _unitofworkmanager;
		//依赖注入仓储、工作单元实例
        public MainconferenceAppService(IUnitOfWorkManager unitofwork,IRepository<MainConference.MainConference,Guid> repository,
            IRepository<SubConference.SubConference,Guid> subconferencerepository)
        {
            _repository = repository;
            _unitofworkmanager = unitofwork;
            _subconferencerepository = subconferencerepository;
        }

        public bool AddMainConference(MainConferenceDto con)
        {
            var find=_repository.GetAll().OrderByDescending(_ => _.ReMark).FirstOrDefault();
            var addstr = find?.Name;
            if (!string.IsNullOrEmpty(addstr))
            {
                var str = addstr.Replace("MainCon", "");
                addstr = (Convert.ToInt32(str) + 1).ToString().PadLeft(3, '0');
            }
            else
                addstr = "001";

            if (con != null)
            {
                if (string.IsNullOrEmpty(con.Name))
                    con.Name = "MainCon"+addstr;
                if (string.IsNullOrEmpty(con.Address))
                    con.Address = "Address" + addstr; ;
                if (string.IsNullOrEmpty(con.ReMark))
                    con.ReMark = "Mark" + addstr; ;
                var task = ObjectMapper.Map<MainConference.MainConference>(con);
                _repository.Insert(task);
                return true;
            }
            return false;
        }

        public bool DeleteConference(string name)
        {
            _repository.Delete(_ => _.Name == name);
            return true;
        }

        public bool EditMainConference(string name)
        {
            var findcon = _repository.FirstOrDefault(_ => _.Name == name);
            if (findcon == null)
                return false;
            else
            {
                findcon.ReMark = "修改时间" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                _repository.Update(findcon);
            }

            return true;
        }

        public List<MainConferenceDto> GetAllConference()
        {
            return ObjectMapper.Map<List<MainConferenceDto>>(_repository.GetAll().ToList());
        }

        public List<MainConferenceDto> GetConferenceList(CommonSearch s)
        {
            throw new NotImplementedException();
        }

        //[UnitOfWork]  //方式一:添加特性,启用abp工作单元
        public bool InsertAndUpdate()
        {
            //方式二 
            using (var unitofwork = _unitofworkmanager.Begin())
            {
                var findsubcon = _subconferencerepository.GetAll().OrderByDescending(_ => _.SubConferenceId).FirstOrDefault();
                var id = findsubcon?.SubConferenceId;

                var nextid = id.GetValueOrDefault() + 1;
                var nextstr = nextid.ToString().PadLeft(4, '0');

                var sub = new SubConference.SubConference() {
                    SubConferenceId = nextid,
                    Name = "SubConference" + nextstr,
                    ReMark = "Mark" + nextstr,
                    MainConferenceId = Guid.NewGuid(),
                    CreateDate = DateTime.Now,
                    StratDate=DateTime.Now,
                };

                _subconferencerepository.Insert(sub);
                
                //提交工作单元中的数据操作,如果发生异常数据会回滚
                //_unitofworkmanager.Current.SaveChanges();

                var findmain = _repository.FirstOrDefault(_ => _.Name == "MainCon001");
                if (findmain != null)
                {
                    findmain.ReMark = "修改时间---"+DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                    sub.MainConferenceId = findmain.Id;
                    //工作单元中修改自动保存
                    //_repository.Update(findmain);
                }

                //提交
                unitofwork.Complete();
                return true;
            }
        }
    }
}

bool AddMainConference(MainConferenceDto con); 这个接口需要完成Dto到实体的映射,在应用层 ***ApplicationModule.cs中加入代码

cfg.CreateMap<MainConferenceDto,MainConference.MainConference>();

工作单元设置

在领域层Core项目的 xxxCoreModule.cs中添加

 #region 工作单元属性设置
            Configuration.UnitOfWork.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted;
            Configuration.UnitOfWork.Timeout = TimeSpan.FromMinutes(30);
  #endregion

这里涉及到的映射,接口调用测试可以参考上一篇文章:Dto与实体模型映射-AutoMapper
调试中去掉实现类的 [AbpAuthorize] 特性,进行非授权调用,在下篇中加上进行授权请求调用

解析ABP框架中的事务处理和工作单元 ABP是"ASP.NET Boilerplate Project(ASP.NET样板项目)"的简称,是一个建立在.NET之上的Web开发框架,下面我们来解析ABP框架中的事务处理和工作单元 立即下载

相关推荐

矩阵束(Matrix Pencil)入门:从通信系统到控制理论,它为何是建模利器?

本文深入探讨矩阵束(Matrix Pencil)在通信系统与控制理论中的关键作用,揭示其作为复杂系统建模利器的独特价值。从MIMO系统的多径干扰分析到电力系统稳定性判据,矩阵束通过`A-λB`方程求解提供精准建模方案,显著提升5G通信和工业控制等领域的性能表现。

weixin_30134145的博客 359

ABP: 工作单元unitOfWork

所以,我们:事务的提供往往是由数据库管理程序来提供的,而这一类组件我们一般将它们放置在基础构架层,而领域层可以依赖于基础构架层,所以千万要注意,保持您的领域层足够干净,不要让其它的东西干扰它,也更不要将事务处理这类东西放到了您的领域层来。...

dongnihao的博客 1801

基于Arduino与光电传感器的心率监测系统:从原理到实现的完整指南

光电式心率监测是一种基于光电容积脉搏波描记法(PPG)的非侵入式生命体征测量技术。其核心原理是利用特定波长光线照射皮肤组织,通过检测因血液容积周期性变化导致的反射光强微弱波动,来获取心率信息。这项技术的关键价值在于实现了低成本、便携化的连续生理参数监测,广泛应用于健康管理、运动科学及嵌入式系统教学领域。在工程实践中,信号处理算法(如移动平均滤波与动态阈值峰值检测)对提升测量精度至关重要。本文以Arduino平台为例,详细解析了如何集成MAX30102或Pulse Sensor Amped等光电传感器,结合T

weixin_33461476的博客 245

【ABP】工作单元——不进行事物独立执行功能

1.注入 private readonly IUnitOfWorkManager unitOfWorkManager; 2.构造 3.开启新事物 using (var unitOfWork = unitOfWorkManager.Begin(TransactionScopeOption.RequiresNew)) {  //todo someting ...

weixin_30794491的博客 330

[kriging](一)网上下载的kriging克里金的C++程序的初步调试

笔者在网上下载了一份克里金的C++程序,水平有限,正在逐步地调试中。 初步 克里金法现在在许多软件都已经有集成了,据笔者所知: arcgis : 看过有的arcgis培训视频里面简略介绍了里面的插值方法,有克里金。 surfer :笔者用过这个,效果很好。 gocad :听说有 landmark &jason :研究生时候用的专业的石油物探软件,里面有克里金法,万恶的开始。 pykrig...

FOREST优快云 5611

uniapp - 解决报错 TypeError: e[t] is not a function(Uniapp项目运行或打包编译时提示错误e[t] is not a function,全平台端均可搞定)

uniapp,报错,TypeError: e[t] is not a function,uniapp App端报错,Android端,苹果ios打包报错,运行报错,uniapp打包报错e[t] is not a function,无法运行提示错误,uniapp live-pusher直播推流,maps地图组件,uni-app live-pusher 报错TypeError: e[t] is not a function,uni-app maps报错TypeError: e[t] is not a funct

✅ 精选推荐文章 8222

UnitOfWork以及其在ABP中的应用

Unit Of Work(UoW)模式在企业应用架构中被广泛使用,它能够将Domain Model中对象状态的变化收集起来,并在适当的时候在同一数据库连接和事务处理上下文中一次性将对象的变更提交到数据中。 从字面上我们可以我们可以把UnitOfWork叫做工作单元,从概念上它是协助代码块的事务。为什么我们需要用UnitOfWork?有人说EF不是的DbContext的SaveChanges不就有...

weixin_33901926的博客 710

【Agent实战】Anthropic Skills、MCP与LangGraph的工程实践

随着大语言模型(LLM)应用从简单的Chatbot向自主智能体(Autonomous Agents)演进,如何管理复杂的任务上下文、标准化的工具调用以及确定性的业务流程,成为了系统设计的核心挑战。Anthropic 推出的 Skills 规范,结合 Model Context Protocol (MCP) 与 Function Calling,为构建模块化、可扩展的 Agent 提供了全新的范式。

kakaZhui的博客 584

ABP-工作单元

前言: 什么是工作单元: 意思是可以“工作”的单元:我们再看一个现实中例子,也最能说明Unit Of Work所包含的意思,就是银行转账操作,包含两个动作:转出方扣钱和转入方加钱,这两个动作要么都完成,要么都不完成,也就是事务操作,完成就Commit(提交),完不成就Rollback(回滚)。 回到Unit Of Work的定义,Unit of Work是用来解决领域模型存储和变更工作,在O...

wangwengrui40的博客 3629

软考中级-软件设计师 知识点整理(一篇就过了 建议收藏)

软考中级-软件设计师上午题知识点总结

片言可决讼,半纸能缚龙 17万+

【异常】XXL-JOB提示异常ERROR com.xxl.job.core.util.XxlJobRemotingUtil - connect timed out

打开XXL-JOB的ELK,发现一堆报错。

奶爸的编程之路,也就一周冷个三天 2048

[Practice Note] 3.Abp入门:Dto与实体模型的映射-AutoMapper

新建实体模型与Dto对象传输模型 namespace ABPTest.EntityModel { [Table("Common_Participant")] //数据库表名,会议参与者表 public class Participant:FullAuditedEntity<int> { //姓名 public string Name ...

NoFind_Coder的博客 1665

【2026OD新机考】【不定滑窗】20260415-API请求日志去重分析【Py/Java/C++/C/JS/Go六种语言OD真题】【欧弟算法】全网注释最详细分类最全的华子OD真题题解

中找到所有的连续的相同元素,同时统计对应的连续相同元素对应的值的平均值。:当右指针为第一个元素(没有前一个元素),或者右指针对应的元素。某微服务系统的日志监控平台需分析API调用记录,日志含大量。相等,说明当前元素仍然属于同一个相同元素窗口,将当前元素值。中的所有元素均相等,并且计算窗口和情况即可。请实现一个函数,对给定的日志数据去重合并处理。位置,表示开启一个新的窗口,此时需要重置窗口和。,为了优化重复的请求记录,存储和后续分析需对。:对应的响应时间数组(毫秒)。重新置为当前右指针的元素值。

weixin_48157259的博客 112

[Practice Note] 5.Abp入门:集成SwaggerUI,授权调用Webapi

Demo项目地址:https://download.csdn.net/download 创建实现业务接口 这里我们直接使用之前定义的接口 第四篇简单业务操作与工作单元 SwaggerUI 在xxx.WebApi项目中添加Swashbuckle引用 修改xxxwebapimodule.cs类 namespace ABPTest.Api { [DependsOn(typeof(AbpWe...

NoFind_Coder的博客 637

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

[Practice Note] 1.Abp入门:模板下载,配置数据库运行

下载Abp模板 官方地址:模板下载地址 下载完成,解压文件!VS2017打开,将每个项目单独编译,还原nuget包 配置数据库CodeFirst 打开Web项目下的Web.Config文件,修改数据库连接字符串 字符配置完成后,生成数据库 打开后台控制程序(“工具”->“Nuget包管理器”->“程序包管理器控制台”) 默认项目选择netframework,输入命令 updata-...

NoFind_Coder的博客 309

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

[Practice Note] 2.Abp入门:DDD实体模型设计,数据迁移

添加实体模型 在Abp的Core项目[领域层]中添加实体 namespace ABPTest.MainConference { public class MainConference:Entity<Guid> { [Description("主会议名")] public string Name { get; set; } [D...

NoFind_Coder的博客 330

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

[Note Practice] Sqlserver 添加表注释,字段注释!查询所有表,字段属性

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Ma...

NoFind_Coder的博客 322

ABP(现代ASP.NET样板开发框架)系列之12、ABP领域层——工作单元(Unit Of work)

点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之12、ABP领域层——工作单元(Unit Of work) ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称。 ABP的官方网站:http://www.aspnetboilerplate.com ABP在Github上的开源项目:https:...

weixin_33982670的博客 448

ABP框架 - 工作单元

文档目录 本节内容: 简介 在ABP中管理连接和事务 约定的工作单元 UnitOfWork 特性 IUnitOfWorkManager 工作单元详情 禁用工作单元 非事务性工作单元 工作单元方法调用另一个方法 工作单元域 自动保存修改 IRepository.GetAll() 方法 UnitOfWork 限制 选...

aichun6888的博客 396

ABP理论学习之工作单元(Unit of Work)

返回总目录 本篇目录 公共连接和事务管理方法 ABP中的连接和事务管理 仓储类 应用服务 工作单元 工作单元详解 关闭工作单元 非事务的工作单元 工作单元方法调用其它 工作单元作用域 自动保存 IRepository.GetAll()方法 UnitOfWork特性的限制 选项 方法 事件 公共连接和事务管理方法 在使用了数据库的应用中,连接和事务管理是最重要的概念之一。何时打开一个连...

weixin_33734785的博客 646

Unit Of Work的设计

在DDD开发过程中,一个良好的Uow设计必不可少,我心目中的Uow设计应该具备以下几点: 1、有着良好的抽象,有着恰如其分的命名; 2、能够应付不同的组件,比如你的系统中可能会存在EfUnitOfWork、RedisUnitOfWork; 3、易于使用,不用开发者显示调用。Uow在一个用户请求开始到结束能够自动包裹在业务逻辑外边; 在阅读了Abp的源码后我感觉Abp中的Uow正好符合我这几...

weixin_34233618的博客 281

ABP领域层知识回顾之---工作单元

1. 前言   在上一篇博文中(http://www.cnblogs.com/xiyin/p/6842958.html) 我们讲到了ABP领域层的仓储。这边博文我们来讲 工作单元。个人觉得比较重要。文章的大致结构分为六部分,如下图所示: 2. 工作单元 2.1 通用连接和事务管理方法  .NET 使用连接池(connection pooling)。因此,创建一个连接实际上是从连接池中...

dienen0325的博客 327

ABP工作单元

简介 Unit of work:维护受业务事务影响的对象列表,并协调变化的写入和并发问题的解决。即管理对象的CRUD操作,以及相应的事务与并发问题等。Unit of Work是用来解决领域模型存储和变更工作,而这些数据层业务并不属于领域模型本身具有的 我们知道在ABP中应用服务层,仓储。默认是启用工作单元模式的 若我们关闭了全局的工作单元,则必须以特性的方式在 class,method inter...

weixin_30871293的博客 431

在 ABP vNext 中优雅使用工作单元(Unit of Work)

ABP vNext 的工作单元机制为事务控制提供了极大便利。✅写操作使用自动事务;✅复杂调用用显式处理;✅读操作禁用事务提升性能;✅事件应在事务后发送以保持一致性;✅后台任务要显式启用事务。🧠 合理使用工作单元不仅提高代码质量,还能提升系统稳定性与扩展性。

Kookoos的博客 1687

[解决]ABP操作数据库 报错:System.ArgumentNullException:“Value cannot be null. Arg_ParamName_Name”

【代码】[解决]ABP操作数据库 报错:System.ArgumentNullException:“Value cannot be null. Arg_ParamName_Name”

小目标一个亿 2693
上一篇: [Practice Note] 3.Abp入门:Dto与实体模型的映射-AutoMapper
下一篇: [Practice Note] 5.Abp入门:集成SwaggerUI,授权调用Webapi
Gen??
博客等级 码龄7年 24粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值