184 lines
6.2 KiB
C#
184 lines
6.2 KiB
C#
|
|
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;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|