Files
Yi.Framework/Yi.Abp.Net8/src/Yi.Abp.Application/Services/TestService.cs
2025-02-01 21:53:05 +08:00

219 lines
7.4 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System.Xml.Linq;
using Mapster;
using Medallion.Threading;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.RateLimiting;
using Volo.Abp.Application.Services;
using Volo.Abp.DistributedLocking;
using Volo.Abp.Settings;
using Volo.Abp.Uow;
using Yi.Framework.Bbs.Application.Contracts.Dtos.Banner;
using Yi.Framework.Bbs.Domain.Entities.Forum;
using Yi.Framework.Rbac.Domain.Authorization;
using Yi.Framework.Rbac.Domain.Extensions;
using Yi.Framework.SettingManagement.Domain;
using Yi.Framework.SqlSugarCore.Abstractions;
namespace Yi.Abp.Application.Services
{
/// <summary>
/// 常用魔改及扩展示例
/// </summary>
public class TestService : ApplicationService
{
/// <summary>
/// 属性注入
/// 不推荐,坑太多,容易把自己玩死,简单的东西可以用一用
/// </summary>
public ISqlSugarRepository<BannerAggregateRoot> sqlSugarRepository { get; set; }
/// <summary>
/// 动态Api
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
[HttpGet("hello-world")]
public string GetHelloWorld(string? name)
{
//会自动添加前缀,而不是重置,更符合习惯
//如果需要重置以"/"根目录开头即可
//你好世界
return name ?? "HelloWord";
}
/// <summary>
/// 异常处理
/// </summary>
/// <returns></returns>
[HttpGet("error")]
public string GetError()
{
throw new UserFriendlyException("业务异常");
throw new Exception("系统异常");
}
/// <summary>
/// SqlSugar
/// </summary>
/// <returns></returns>
public async Task<object> GetSqlSugarDbAsync()
{
//用户体验优先可直接使用Db操作依赖抽象
return await sqlSugarRepository._DbQueryable.ToListAsync();
}
/// <summary>
/// 工作单元
/// </summary>
/// <returns></returns>
public async Task GetUowAsync()
{
//魔改
// 用户体验优先,万金油模式,支持高并发。支持单、多线程并发安全,支持多线程工作单元,支持。。。
// 不支持多线程无工作单元应由工作单元统一管理来自abp工作单元设计
// 请注意如果requiresNew: true只有在没有工作单元内使用嵌套子工作单元默认值false即可
// 自动在各个情况处理db客户端最优解之一
int i = 3;
List<Task> tasks = new List<Task>();
await sqlSugarRepository.GetListAsync();
await sqlSugarRepository.GetListAsync();
while (i > 0)
{
tasks.Add(Task.Run(async () =>
{
//以下操作是错误的不允许在新线程中直接操作db所有db操作应放在工作单元内应由工作单元统一管理-来自abp工作单元设计
//await sqlSugarRepository.InsertAsync(new BannerAggregateRoot { Name = "插入2" });
using (var uow = UnitOfWorkManager.Begin(requiresNew: true, isTransactional: true))
{
await sqlSugarRepository.InsertAsync(new BannerAggregateRoot { Name = "插入1" });
await uow.CompleteAsync();
}
}));
await sqlSugarRepository.InsertAsync(new BannerAggregateRoot { Name = "插入3" });
i--;
}
await Task.WhenAll(tasks);
}
/// <summary>
/// 当前用户
/// </summary>
/// <returns></returns>
public void GetCurrentUser()
{
//当token鉴权之后可以直接获取
if (CurrentUser.Id is not null)
{
//权限
CurrentUser.GetPermissions();
//角色信息
CurrentUser.GetRoleInfo();
//部门id
CurrentUser.GetDeptId();
}
}
/// <summary>
/// 数据权限
/// </summary>
public void GetDataFilter()
{
//这里会数据权限过滤
using (DataFilter.DisablePermissionHandler())
{
//这里不会数据权限过滤
}
//这里会数据权限过滤
}
/// <summary>
/// 对象映射
/// </summary>
public void GetMapper()
{
//直接无脑Adapt无需配置
var entity = new BannerAggregateRoot();
var dto = entity.Adapt<BannerGetListOutputDto>();
}
private static int RequestNumber { get; set; } = 0;
/// <summary>
/// 速率限制
/// </summary>
/// <returns></returns>
// [DisableRateLimiting]
//[EnableRateLimiting("sliding")]
public int GetRateLimiting()
{
RequestNumber++;
return RequestNumber;
}
public ISettingProvider _settingProvider { get; set; }
public ISettingManager _settingManager { get; set; }
/// <summary>
/// 系统配置模块
/// </summary>
/// <returns></returns>
public async Task<string> GetSettingAsync()
{
//DDD需要提前定义
//默认来说,不提供修改操作,配置应该独立
var enableOrNull = await _settingProvider.GetOrNullAsync("DDD");
//如果要进行修改可使用yi.framework下的ISettingManager
await _settingManager.SetGlobalAsync("DDD", "false");
var enableOrNull2 = await _settingManager.GetOrNullGlobalAsync("DDD");
//当然,他的独特地方,是支持来自多个模块,例如配置文件?
var result = await _settingManager.GetOrNullConfigurationAsync("Test");
return result ?? string.Empty;
}
/// <summary>
/// 分布式送abp版本abp套了一层娃。但是纯粹鸡肋不建议使用这个
/// </summary>
public IAbpDistributedLock AbpDistributedLock { get; set; }
/// <summary>
/// 分布式锁推荐使用版本yyds分布式锁永远的神
/// </summary>
public IDistributedLockProvider DistributedLock { get; set; }
/// <summary>
/// 分布式锁
/// </summary>
/// <remarks>强烈吐槽一下abp正如他们所说abp的分布式锁单纯为了自己用一切还是以DistributedLock为主</remarks>>
/// <returns></returns>
public async Task<string> GetDistributedLockAsync()
{
var number = 0;
await Parallel.ForAsync(0, 100, async (i, cancellationToken) =>
{
await using (await DistributedLock.AcquireLockAsync("MyLockName"))
{
//执行1秒
number += 1;
}
});
var number2 = 0;
await Parallel.ForAsync(0, 100, async (i, cancellationToken) =>
{
//执行1秒
number2 += 1;
});
return $"加锁结果:{number},不加锁结果:{number2}";
}
}
}