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

本文介绍了如何在Abp框架中实现应用层的简单业务操作,包括动态生成WebAPI接口,如AddMainConference接口,以及工作单元的设置。通过示例项目和代码展示了Dto到实体的映射,并在ApplicationModule.cs中配置工作单元。同时提到了在Core层的模块中添加相关设置,并预告了后续关于授权调用的内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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] 特性,进行非授权调用,在下篇中加上进行授权请求调用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值