tijian_tieying/web/cyqdata-master/Aop/InterAop.cs

186 lines
5.9 KiB
C#
Raw Normal View History

2025-02-20 12:14:39 +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 CacheManage _Cache = CacheManage.LocalInstance;//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 && (AppConfig.Cache.IsAutoCache || outerAop != null);
}
}
internal bool IsTxtDataBase
{
get
{
return Para.DalType == DalType.Txt || Para.DalType == DalType.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();
}
#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 (AppConfig.Cache.IsAutoCache && !IsTxtDataBase) // ֻҪ<D6BB><D2AA><EFBFBD><EFBFBD>ֱ<EFBFBD>ӷ<EFBFBD><D3B7><EFBFBD>
{
isHasCache = AutoCache.GetCache(action, Para); //<2F>ҿ<EFBFBD><D2BF><EFBFBD>û<EFBFBD><C3BB>Cache
}
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 && !IsTxtDataBase && 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>
{
AutoCache.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>
}
_IsLoadCompleted = true;
System.Reflection.Assembly ass = System.Reflection.Assembly.Load(aopItem[1]);
if (ass != null)
{
object instance = ass.CreateInstance(aopItem[0]);
if (instance != null)
{
_Cache.Set(key, instance, 1440, AppConst.RunFolderPath + aopItem[1].Replace(".dll", "") + ".dll");
aop = instance as IAop;
aop.OnLoad();
}
}
}
}
catch (Exception err)
{
string errMsg = err.Message + "--Web.config need add a config item,for example:<add key=\"Aop\" value=\"Web.Aop.AopAction,Aop\" />(value format:namespace.Classname,Assembly name) ";
Error.Throw(errMsg);
}
}
}
#endregion
}
}
if (aop != null)
{
return aop.Clone();
}
return null;
}
#region <EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//public static InterAop Instance
//{
// get
// {
// return Shell.instance;
// }
//}
//class Shell
//{
// internal static readonly InterAop instance = new InterAop();
//}
#endregion
}
}