ZhiYeJianKang_PeiXun/cyqdata-master/Aop/InterAop.cs

184 lines
6.2 KiB
C#
Raw Normal View History

2025-02-20 15:41:53 +08:00
using CYQ.Data.Cache;
using System;
using CYQ.Data.Table;
namespace CYQ.Data.Aop
{
/// <summary>
/// <20>ڲ<EFBFBD>Ԥ<EFBFBD><D4A4>ʵ<EFBFBD><CAB5>CacheAop
/// </summary>
internal class InterAop
{
private DistributedCache _Cache = DistributedCache.Local;//Cache<68><65><EFBFBD><EFBFBD>
// private AutoCache cacheAop = new AutoCache();
private static readonly object lockObj = new object();
internal bool isHasCache = false;
public AopOp aopOp = AopOp.OpenAll;
internal bool IsLoadAop
{
get
{
return aopOp != AopOp.CloseAll;
}
}
internal bool IsTxtDataBase
{
get
{
return Para.DalType == DataBaseType.Txt || Para.DalType == DataBaseType.Xml;
}
}
private AopInfo _AopInfo;
/// <summary>
/// Aop<6F><70><EFBFBD><EFBFBD>
/// </summary>
public AopInfo Para
{
get
{
if (_AopInfo == null)
{
_AopInfo = new AopInfo();
}
return _AopInfo;
}
}
private IAop outerAop;
public InterAop()
{
outerAop = GetFromConfig();
if (outerAop == null)
{
aopOp = AppConfig.AutoCache.IsEnable ? AopOp.OnlyInner : AopOp.CloseAll;
}
else
{
aopOp = AppConfig.AutoCache.IsEnable ? AopOp.OpenAll : AopOp.OnlyOuter;
}
}
#region IAop <EFBFBD><EFBFBD>Ա
public AopResult Begin(AopEnum action)
{
AopResult ar = AopResult.Continue;
if (outerAop != null && (aopOp == AopOp.OpenAll || aopOp == AopOp.OnlyOuter))
{
ar = outerAop.Begin(action, Para);
if (ar == AopResult.Return)
{
return ar;
}
}
if (aopOp == AopOp.OpenAll || aopOp == AopOp.OnlyInner)
{
if (!IsTxtDataBase) // ֻҪ<D6BB><D2AA><EFBFBD><EFBFBD>ֱ<EFBFBD>ӷ<EFBFBD><D3B7>أ<EFBFBD>------<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD><C6A3><EFBFBD>Aop<6F><70><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ơ<EFBFBD>
{
isHasCache = AopCache.GetCache(action, Para); //<2F>ҿ<EFBFBD><D2BF><EFBFBD>û<EFBFBD><C3BB>Cache<68><65><EFBFBD>м<EFBFBD>ȡ<EFBFBD><C8A1>Ԥ<EFBFBD><D4A4><EFBFBD><EFBFBD>
}
if (isHasCache) //<2F>ҵ<EFBFBD>Cache
{
if (outerAop == null || ar == AopResult.Default)//<2F><>ִ<EFBFBD><D6B4>End
{
return AopResult.Return;
}
return AopResult.Break;//<2F>ⲿAop˵<70><CBB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫִ<D2AA><D6B4>End
}
}
return ar;// û<><C3BB>Cache<68><65>Ĭ<EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD>
}
public void End(AopEnum action)
{
if (outerAop != null && (aopOp == AopOp.OpenAll || aopOp == AopOp.OnlyOuter))
{
outerAop.End(action, Para);
}
if (aopOp == AopOp.OpenAll || aopOp == AopOp.OnlyInner)
{
if (!isHasCache && Para.IsSuccess)//Select<63>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>GetCount<6E><74>GetCount<6E><74><EFBFBD>ڲ<EFBFBD>isHasCacheΪtrueӰ<65><D3B0><EFBFBD><EFBFBD>
{
AopCache.SetCache(action, Para); //<2F>ҿ<EFBFBD><D2BF><EFBFBD>û<EFBFBD><C3BB>Cache
}
}
}
public void OnError(string msg)
{
if (outerAop != null)
{
outerAop.OnError(msg);
}
}
#endregion
static bool _IsLoadCompleted = false;
private IAop GetFromConfig()
{
IAop aop = null;
string aopApp = AppConfig.Aop;
if (!string.IsNullOrEmpty(aopApp))
{
string key = "OuterAop_Instance";
if (_Cache.Contains(key))
{
aop = _Cache.Get(key) as IAop;
}
else
{
#region AOP<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
string[] aopItem = aopApp.Split(',');
if (aopItem.Length == 2)//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(dll)<29><><EFBFBD><EFBFBD>
{
if (!_IsLoadCompleted)
{
try
{
lock (lockObj)
{
if (_IsLoadCompleted)
{
return GetFromConfig();//<2F><><EFBFBD><EFBFBD>ȥ<EFBFBD><C8A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>á<EFBFBD>
}
System.Reflection.Assembly ass = System.Reflection.Assembly.Load(aopItem[1]);
if (ass != null)
{
object instance = ass.CreateInstance(aopItem[0]);
if (instance != null)
{
aop = instance as IAop;
if (aop == null)
{
Error.Throw(aopItem[0] + " should inherit from IAop.");
}
_Cache.Set(key, instance, 1440, AppConst.AssemblyPath + aopItem[1].Replace(".dll", "") + ".dll");
_IsLoadCompleted = true;
aop.OnLoad();
}
}
}
}
catch (Exception err)
{
string errMsg = err.Message + "--Web|App.config need add a config item,for example:<add key=\"Aop\" value=\"Web.Aop.AopAction,Aop\" />(value format : ClassFullName,AssemblyName) ";
Error.Throw(errMsg);
}
}
}
#endregion
}
}
if (aop != null)
{
IAop cloneAop= aop.Clone();
return cloneAop == null ? aop : cloneAop;
}
return null;
}
}
}