123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- using DirectService.Tools;
- using JLHHJSvr.BLL;
- using JLHHJSvr.Com.Model;
- using LJLib;
- using LJLib.DAL.SQL;
- using System;
- using System.Collections.Concurrent;
- using System.Collections.Generic;
- using System.Data.SqlClient;
- using System.Linq;
- using System.Reflection;
- namespace JLHHJSvr.Helper
- {
- internal sealed class CacheHelper : HelperBase
- {
- #region 基础资料Mapping
- /// <summary>
- /// 弹簧资料
- /// </summary>
- public class SpringMapping : ICacheMapping<int, u_spring>
- {
- public u_spring GetInstance(SqlCommand cmd, int springid)
- {
- var instance = new u_spring() { springid = springid };
- DbSqlHelper.SelectOne(cmd, instance, "line_diameter,gram_weight,height,center_diameter,caliber,cyclenum,roll_width,roll_length,arrangement_width,arrangement_height,springtypeid");
- return instance;
- }
- }
- /// <summary>
- /// 部门资料
- /// </summary>
- public class DeptMapping : ICacheMapping<int, u_dept>
- {
- public u_dept GetInstance(SqlCommand cmd, int deptid)
- {
- var instance = new u_dept() { deptid = deptid };
- DbSqlHelper.SelectOne(cmd, instance, "pricelistid,profitrate,moneyrate,discount,taxes_rate,managerate,com_profitrate,dannum1_rate,dannum2_rate,dannum3_rate,dannum4_rate");
- return instance;
- }
- }
- #endregion
- #region 获取数据
- private static readonly Dictionary<Type, object> _cacheServiceRegistry = new Dictionary<Type, object>();
- public TEntity GetData<TEntity, TMapping>(object key)
- where TEntity : class, new()
- where TMapping : new()
- {
- // 找到接口中的 TKey
- var mappingType = typeof(TMapping);
- var iface = mappingType.GetInterfaces()
- .FirstOrDefault(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(ICacheMapping<,>));
- if (iface == null)
- throw new InvalidOperationException($"{mappingType.Name} must implement ICacheMapping<TKey, TValue>");
- var keyType = iface.GetGenericArguments()[0];
- // 获取私有泛型方法
- var method = typeof(CacheHelper).GetMethod(nameof(GetDataInternal), BindingFlags.Instance | BindingFlags.NonPublic);
- var gm = method.MakeGenericMethod(keyType, typeof(TEntity), mappingType);
- // 调用并返回(Invoke 返回 object)
- return (TEntity)gm.Invoke(this, new object[] { key });
- }
- private TValue GetDataInternal<TKey, TValue, TMapping>(object key)
- where TMapping : ICacheMapping<TKey, TValue>, new()
- where TValue : class, new()
- {
- var mappingType = typeof(TMapping);
- if (!_cacheServiceRegistry.TryGetValue(mappingType, out var serviceObj))
- {
- // 没有就创建
- var cacheService = new CacheService<TKey, TValue>(new GenericLoader<TKey, TValue>(new TMapping()));
- _cacheServiceRegistry.Add(mappingType, cacheService);
- serviceObj = cacheService;
- }
- var service = (ICacheService<TKey, TValue>)serviceObj;
- return service.Get(cmd, (TKey)key);
- }
- #endregion
- }
- }
|