SqlSugarExtensions扩展优化

This commit is contained in:
lqc 2025-03-12 10:08:57 +08:00
parent d825c5d7e8
commit 8d58fa2270

View File

@ -4,46 +4,38 @@ public static class SqlSugarExtensions
{ {
private const string DefaultTenantId = "1300000000001"; private const string DefaultTenantId = "1300000000001";
public static ISqlSugarClient ForTenant<TEntity>( public static ISqlSugarClient ForTenant<TEntity>(this ISqlSugarClient db)
this ISqlSugarClient db)
{ {
var attr = typeof(TEntity).GetCustomAttribute<TenantAttribute>(); var attr = typeof(TEntity).GetCustomAttribute<TenantAttribute>();
var tenantId = attr != null ? GetConfigIdFromAttribute(attr) : DefaultTenantId;
// 当特性不存在时使用默认租户 return db.AsTenant().GetConnection(tenantId ?? DefaultTenantId);
if (attr == null)
{
return db.AsTenant().GetConnection(DefaultTenantId);
} }
// 反射获取租户ID兼容多种字段命名 private static string GetConfigIdFromAttribute(TenantAttribute attr)
var tenantId = GetTenantIdFromAttribute(attr) ?? DefaultTenantId;
return db.AsTenant().GetConnection(tenantId);
}
private static string GetTenantIdFromAttribute(TenantAttribute attr)
{ {
const string tenantIdKey = "TenantId"; const string targetKey = "configId";
var type = attr.GetType(); var type = attr.GetType();
// 尝试通过属性获取 // 方式1尝试通过属性获取
var prop = type.GetProperty(tenantIdKey, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); var prop = type.GetProperty(targetKey,
BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
if (prop != null) if (prop != null)
{ {
return prop.GetValue(attr) as string; return prop.GetValue(attr) as string;
} }
// 尝试通过私有字段获取(兼容不同命名规范) // 方式2尝试通过私有字段获取
var fields = new[] var fieldNames = new[]
{ {
$"<{tenantIdKey}>k__BackingField", // 编译器生成字段 $"<{targetKey}>k__BackingField", // 自动属性字段
$"_{tenantIdKey.ToLower()}", // 常规私有字段 $"_{targetKey}", // 常规私有字段 (如_configId)
$"m_{tenantIdKey}" // 其他可能的前缀 $"m_{targetKey}", // 匈牙利命名法
"configId" // 直接字段访问
}; };
foreach (var fieldName in fields) foreach (var name in fieldNames)
{ {
var field = type.GetField(fieldName, var field = type.GetField(name,
BindingFlags.NonPublic | BindingFlags.Instance); BindingFlags.NonPublic | BindingFlags.Instance);
if (field != null) if (field != null)
{ {
@ -51,6 +43,16 @@ public static class SqlSugarExtensions
} }
} }
// 方式3通过Dynamic访问备用方案
try
{
dynamic d = attr;
return d.configId;
}
catch
{
return null; return null;
} }
}
} }