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