在本人的
那麼Context與AOP兩者在邏輯上是一個怎樣的概念呢?似乎只有圖才能最貼切的表達人的理解思路
Context圖
對象在運行時被上下文管理
在模型圖中
AOP圖
通過合理的約定對象的AOP抽象接口
在上圖中
對上下文
面向對象是對抽象的邏輯模型進行物理性的建模
我們對上下文模型進行抽象實現為代碼模型
using (ContextModule
{ //上下文的生命周期
}
為什麼要這樣設計上下文的生命周期呢
當Using()代碼段結束後
void IDisposable
{
_currentContextRuntime = null;
}
_ currentContextRuntime表示上下文對象實例的全局私有對象
由於多線程應用框架的入口點不是我們所能控制的
[ThreadStatic]
private static ContextRuntime _currentContextRuntime;
我們看一下全部的ContextRuntime對象代碼
[csharp]
/***
* author:深度訓練
* blog:
* **/
using System;
using System
using System
namespace ContextModule
{
/// <summary>
/// 上下文運行時環境
/// 上下文邏輯運行時環境
/// </summary>
public class ContextRuntime : IDisposable
{
#region IDisposable成員
void IDisposable
{
_currentContextRuntime = null;
}
#endregion
protected ContextRuntime() { }
private DateTime _initTime = DateTime
/// <summary>
/// 獲取運行時創建上下文的時間
/// </summary>
public virtual DateTime InitTime { get { return _initTime; } }
private Dictionary<object
private ContextFilterHandlerMap _filterMap = new ContextFilterHandlerMap()
/// <summary>
/// 獲取上下文中的方法
/// </summary>
public ContextFilterHandlerMap FilterMap { get { return _filterMap; } }
private Guid _initPrimaryKey = Guid
/// <summary>
/// 獲取運行時創建上下文的唯一標識
/// </summary>
public virtual Guid InitPrimaryKey { get { return _initPrimaryKey; } }
/// <summary>
/// 獲取上下文共享區域中的數據
/// </summary>
/// <param name=
/// <returns>object數據對象</returns>
public virtual object GetValue(object key)
{
return _runTimeResource[key];
}
/// <summary>
/// 設置上下文共享區域中的數據
/// </summary>
/// <param name=
/// <param name=
public virtual void SetValue(object key
{
_runTimeResource[key] = value;
}
[ThreadStatic]
private static ContextRuntime _currentContextRuntime;
/// <summary>
/// 獲取當前上下文運行時對象
/// </summary>
public static ContextRuntime CurrentContextRuntime { get { return _currentContextRuntime; } }
/// <summary>
/// 開始運行時上下文
/// </summary>
/// <returns>ContextRuntime</returns>
public static ContextRuntime BeginContextRuntime()
{
//可以通過配置文件配置上下文運行時環境的參數
_currentContextRuntime = new ContextRuntime()
return _currentContextRuntime;
}
}
}
這裡只為了實現基本的模型原型
有了上下文之後
那麼我們需要對客戶使用的對象進行一個抽象
所以我們將ContextModuleBaseObject定義為泛型類
這裡我們需要將ContextModuleBaseObject 對象繼承自ContextRuntime對象
[csharp]
/***
* author:深度訓練
* blog:
* **/
using System;
using System
using System
using System
namespace ContextModule
{
/// <summary>
/// 上下綁定基類
/// 邏輯上下文的策略構造都在這裡進行
/// </summary>
/// <typeparam name=
public class ContextModuleBaseObject<T> : ContextRuntime where T : class
{
/// <summary>
/// 當前上下文綁定對象所綁定到的上下文物理對象實例
/// </summary>
private ContextRuntime _contextRunTime;
public ContextModuleBaseObject()
{
if (typeof(T)
{
_IsEvening = true;
return;
}
//前期靜態綁定上下文
if (ContextRuntime
throw new Exception(
_contextRunTime = ContextRuntime
_InitContextHandler<T>()
}
/// <summary>
/// 構造上下文的類過濾器
/// </summary>
private void _InitContextHandler<ChildType>() where ChildType : class
{
//構造類過濾器
ContextOperationBaseAttribute[] classattr =
typeof(ChildType)
if (classattr
{
ContextOperationBaseAttribute joinoper = _JoinOperation(classattr)
_contextRunTime
}
//構造方法過濾器
foreach (MethodInfo method in typeof(ChildType)
{
ContextOperationBaseAttribute[] methodattr =
method
if (methodattr
continue;
ContextOperationBaseAttribute joinoper = _JoinOperation(methodattr)
_contextRunTime
}
}
internal bool _IsEvening { get; set; }
/// <summary>
/// 後期動態綁定上下文
/// </summary>
internal void _EveningBoundChildClass<ChildType>() where ChildType : class
{
if (_contextRunTime != null)
return;//說明之前已經進行過動態調用
_contextRunTime = ContextRuntime
_InitContextHandler<ChildType>()
}
private ContextOperationBaseAttribute _JoinOperation(ContextOperationBaseAttribute[] operationarray)
{
//必須對數組進行排序後才能連接
for (int i =
{
for (int j =
{
if (operationarray[j]
{
ContextOperationBaseAttribute oper = operationarray[j];
operationarray[j] = operationarray[j +
operationarray[j +
}
}
}
ContextOperationBaseAttribute opernext = operationarray[
for (int i =
{
opernext
opernext = operationarray[i];//保持對當前循環對象的上級對象的引用
}
return operationarray[
}
public MethodInfo GetMethodInfo(string methodname)
{
return this
}
public override Guid InitPrimaryKey
{
get
{
return _contextRunTime
}
}
public override DateTime InitTime
{
get
{
return _contextRunTime
}
}
public override object GetValue(object key)
{
return _contextRunTime
}
public override void SetValue(object key
{
_contextRunTime
}
}
}
ContextModuleBaseObject 類主要實現的功能就是將對象動態的添加到當前上下文中
對_JoinOperation方法的解釋我們留在後面
類型串成鏈表
為了讓綁定對象支持上下文後期綁定
[csharp]
/***
* author:深度訓練
* blog:
* **/
using System;
using System
using System
namespace ContextModule
{
/// <summary>
/// 確定設置類是否需要後期動態綁定到上下文
/// 使用該特性的類將是上下文活躍的
/// </summary>
[AttributeUsage(AttributeTargets
public class ContextEveningBoundAttribute : Attribute
{
public ContextEveningBoundAttribute() { }
private bool _isEvening;
/// <summary>
/// 指定對象是否需要後期動態綁定上下文
/// </summary>
public bool IsEvening { set { _isEvening = value; } get { return _isEvening; } }
}
}
僅僅為了標識後期綁定說明
[csharp]
public ContextModuleBaseObject()
{
if (typeof(T)
{
_IsEvening = true;
return;
}
//前期靜態綁定上下文
if (ContextRuntime
throw new Exception(
_contextRunTime = ContextRuntime
_InitContextHandler<T>()
}
到這裡我們已經實現對象的動態綁定到上下文來
其實這裡的契約設計也就是圖
AOP全稱為
在此約定任何處理對象方法的
那麼不同類型的面將有著不同的操作行為
完整的ContextOperationBaseAttribute 類
[csharp]
/***
* author:深度訓練
* blog:
* **/
using System;
using System
using System
namespace ContextModule
{
/// <summary>
/// 上下文操作動作特性化基類
/// 所有對上下文中的類
/// </summary>
public abstract class ContextOperationBaseAttribute : Attribute
{
/// <summary>
/// 過濾器的處理順序
/// </summary>
public int OperationSort { get; set; }
/// <summary>
/// 下一次過濾操作類
/// </summary>
internal ContextOperationBaseAttribute NextOperation { get; set; }
/// <summary>
/// 開始處理過濾對象
/// </summary>
/// <typeparam name=
/// <param name=
/// <param name=
/// <returns></returns>
public virtual Result ResultAction<Result>(ContextMethodInfo actionmethod
{
object result = null;
if (!actionmethod
{
result = (this as IContextOperationHandler)
if (this
return this
}
if (result != null)
return (Result)result;
return default(Result)
}
public abstract object Operation(ContextMethodInfo contextmethod
}
}
作為抽象的頂層類需要完成派生類重復的勞動
由於行為的特性可能存在多個
這裡比較有意思的是
在這裡的ContextOperationBaseAttribute 又描述了另外一種數據結構
那麼我們又如何將ContextOperationBaseAttribute類型串聯起來呢?在ContextModuleBaseObject
泛型綁定類中我們在構造的時候就將通過ContextOperationBaseAttribute
那麼我們如何將具體的對象與特性關聯建立起對應關系呢?一個行為可能有多個ContextOperationBaseAttribute的實現
這裡我將它定義為ContextFilterHandlerMap該類繼承自Dictionary<string
[csharp]
/***
* author:深度訓練
* blog:
* **/
using System;
using System
using System
namespace ContextModule
{
/// <summary>
/// 特定於上下文的過濾器映射表
/// 上下文中的任何方法如果需要進行上下文管理的
/// 所有附加於方法
/// </summary>
public class ContextFilterHandlerMap : Dictionary<string
{
public ContextFilterHandlerMap() { }
/// <summary>
/// 獲取方法對應的過濾器處理特性
/// </summary>
/// <param name=
/// <returns>ContextOperationBaseAttribute特性實例</returns>
public ContextOperationBaseAttribute MapOperation(string mapname)
{
return this[mapname];
}
/// <summary>
/// 設置過濾器與特定方法的映射
/// </summary>
/// <param name=
/// <param name=
public void MapOperation(string mapname
{
this
}
}
}
最後只需要向外提供IContextOperationHandler 接口就可以實現方法與處理特性的串聯了
[csharp]
/***
* author:深度訓練
* blog:
* **/
using System;
using System
using System
using System
namespace ContextModule
{
/// <summary>
/// 上下文操作管理接口
/// </summary>
public interface IContextOperationHandler
{
/// <summary>
/// 開始上下文處理
/// </summary>
/// <param name=
/// 可以通過ContextMethodInfo實例獲取方法詳細信息
///<param name=
object Operation(ContextMethodInfo contextmethod
}
}
通過對外公開接口
這裡基本上實現了AOP對行為的多面支持
對所有方法的調用將是比較頭疼的
通過使用System
通過擴展方法在System
最為完美的是擴展代碼生成提供程序
這裡是使用第二種方式使用的
[csharp]
/***
* author:深度訓練
* blog:
* **/
using System;
using System
using System
using System
namespace ContextModule
{
/// <summary>
/// 面向上下文的操作類
/// 對上下文發起的方法調用需要通過該基類進行調用才能讓我們的擴展點使用成為可能
/// </summary>
public static class ContextAction
{
/// <summary>
/// 在面向上下文的環境中進行方法的調用
/// </summary>
/// <typeparam name=
/// <typeparam name=
/// <param name=
/// <param name=
/// <param name=
/// <returns>ResultType泛型類型指定的返回實例</returns>
public static ResultType PostMethod<PostObjectType
where PostObjectType : ContextModuleBaseObject<PostObjectType>
{
_LockPostObejctIsEveningBound<PostObjectType>(post)
string key = string
if (!ContextRuntime
{
throw new Exception(string
}
ContextMethodInfo contextmethod = new ContextMethodInfo(method
return ContextRuntime
}
/// <summary>
/// 檢查調用實例類是否屬於後期綁定
/// 通過使用ContextModule
/// </summary>
private static void _LockPostObejctIsEveningBound<PostObjectType>(PostObjectType post)
where PostObjectType : ContextModuleBaseObject<PostObjectType>
{
ContextModuleBaseObject<PostObjectType> contextclass = post as ContextModuleBaseObject<PostObjectType>;
if (contextclass
contextclass
}
}
}
所有的調用均使用PostMethod泛型方法啟動
對於實例上下文同時也就存在靜態上下文的概念
基於上下文的使用模式可以進行領域模型的初步構造
在分層架構中的業務邏輯層可能需要加入上下文的管理
From:http://tw.wingwit.com/Article/program/net/201311/11723.html