您的位置:首页 > 运维架构 > 网站架构

.NET面向上下文、AOP架构模式(实现)

2012-08-08 15:34 411 查看
1.上下文Context、面向切面编程AOP模型分析

在本人的.NET面向上下文、AOP架构模式(概述)一文中,我们大概了解了上下文如何辅助对象在运行时的管理。在很多时候我们急需在运行时能把对象控制在一定的逻辑范围内,在必要的时候能让他们体现出集中化的概念,如人群、车辆、动物等等。而Context与AOP有着密切的联系,Context表示逻辑抽象的范围而AOP描述了在这个逻辑范围内如何进行控制。其实这两者都是设计模式外的设计模式,与具体的技术实现无关。[王清培版权所有,转载请给出署名]

那么Context与AOP两者在逻辑上是一个怎样的概念呢?似乎只有图才能最贴切的表达人的理解思路。下图展现Context与AOP紧密合作的概念模型。

Context图:1

View Code

/***
* author:深度训练
* blog:http://wangqingpei557.blog.51cto.com/
* **/
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;

namespace ContextModule
{
/// <summary>
/// 面向上下文的操作类。
/// 对上下文发起的方法调用需要通过该基类进行调用才能让我们的扩展点使用成为可能。
/// </summary>
public static class ContextAction
{
/// <summary>
/// 在面向上下文的环境中进行方法的调用。
/// </summary>
/// <typeparam name="PostObjectType">调用的上下文绑定对象类型</typeparam>
/// <typeparam name="ResultType">方法的返回类型</typeparam>
/// <param name="post">调用的上下文绑定对象的实例</param>
/// <param name="method">方法的信息对象MethodInfo,通过Oject.GetContextMethodInfo方法自动获取。</param>
/// <param name="paramarray">方法的有序参数集合</param>
/// <returns>ResultType泛型类型指定的返回实例</returns>
public static ResultType PostMethod<PostObjectType, ResultType>(PostObjectType post, MethodInfo method, params object[] paramarray)
where PostObjectType : ContextModuleBaseObject<PostObjectType>
{
_LockPostObejctIsEveningBound<PostObjectType>(post);
string key = string.Format("{0}.{1}", method.DeclaringType.FullName, method.Name);
if (!ContextRuntime.CurrentContextRuntime.FilterMap.ContainsKey(key))
{
throw new Exception(string.Format("方法{0}未经过上下文进行管理。", key));
}
ContextMethodInfo contextmethod = new ContextMethodInfo(method, post);
return ContextRuntime.CurrentContextRuntime.FilterMap[key].ResultAction<ResultType>(contextmethod, paramarray);
}
/// <summary>
/// 检查调用实例类是否属于后期绑定。
/// 通过使用ContextModule.ContextEveningBound(IsEvening = true)方式指定后期绑定上下文。
/// </summary>
private static void _LockPostObejctIsEveningBound<PostObjectType>(PostObjectType post)
where PostObjectType : ContextModuleBaseObject<PostObjectType>
{
ContextModuleBaseObject<PostObjectType> contextclass = post as ContextModuleBaseObject<PostObjectType>;
if (contextclass._IsEvening)
contextclass._EveningBoundChildClass<PostObjectType>();
}
}
}


所有的调用均使用PostMethod泛型方法启动。_LockPostObejctIsEveningBound私有方法,判断当前类型是否是后期绑定,如果是则需要切入到基类中调用_ EveningBoundChildClass方法进行ContextOperationBaseAttribute 类型的链表构造,然后直接通过头对象进行调用。[王清培版权所有,转载请给出署名]

3.实例上下文与静态上下文

对于实例上下文同时也就存在静态上下文的概念,对于静态对象的逻辑归纳有点难度,由于静态对象在面向对象设计方面很难抽象。只能通过特性注入的方式强制性的将静态对象拉入上下文。但是在多线程的情况下,确实是可以研究的。将静态对象全部进行线程本地存储,强制性的进行类似实体对象的管理。

4.面向上下文的领域模型(DMM)

基于上下文的使用模式可以进行领域模型的初步构造,可以先向领域中的大比例结构靠近,将业务模型逻辑归纳到一定的Context中,对业务的模块化梳理也是一种实现。
在分层架构中的业务逻辑层可能需要加入上下文的管理,将业务模型进行运行时控制。比如订单处理,将订单业务流程相关的模型对象归纳为一块。比如用户相关,将用户管理的业务流程相关的模型对象归纳为一块,确实是很有意思。

源码地址:http://files.cnblogs.com/wangiqngpei557/ContextModuleDemo.zip
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: