NClay框架AOP功能简介
这里描述的AOP功能是专门针对NClay结构体系的,虽然是这样但开发人员在NClay的结构体系下编写逻辑接口或处理控制器时并不需要实现某些接口或承继某些对象来适应后期的AOP功能切入。框架的AOP功能的实现并不是通过Remoting或动态代理的方式实现,而是由框架内部把执行的代码包装成匿名函数传给切入对象,这样开发人员对最终代码执行的控制更方便。接下来通过代码来简单介绍NClay框架的AOP处理方式。
框架对功能横向切入有两个层面,第一是对视图对象处理的功能切入(如:webform请求);第二是业务逻辑处理的功能切入。两者区别在于视图对象的处理范围更广,在实际应用一个视图的功能输入和输出可能包括一个或多个的逻辑处理。
以上通过一个WEB应用程序的结构来描述框架AOP的处理方式,但实际NClay的MVC结构体系并不只针对WEB应用;在WIN程序中也灵活地使用NClay的MVC结构进行开发。下面通过控制台应用程序来展示框架的AOP功能。
public interface IOrderList
{
int EmployeeID
{
get;
set;
}
System.Collections.IList Orders
{
get;
set;
}
}
[NClay.MVC.Controller]
public class Controller
{
public void OrderList(IOrderList view)
{
Console.WriteLine("EmployeeID:" + view.EmployeeID);
Console.WriteLine("Listed...");
}
}
[NClay.MVC.Action(typeof(TestLogic.IOrderList))]
public class OrderListImpl:TestLogic.IOrderList
{
#region IOrderList 成员
private int mEmployeeID;
public int EmployeeID
{
get
{
return mEmployeeID;
}
set
{
mEmployeeID = value;
}
}
private System.Collections.IList mOrders = new System.Collections.ArrayList();
public System.Collections.IList Orders
{
get
{
return mOrders;
}
set
{
mOrders = value;
}
}
#endregion
}
以上是一个简单的订单查询和相关处理代码,在这里OrderList方法并没对查询逻辑成员值进行限制;如果现在相关对象查询逻辑的EmployeeID做出一些限制,当其值在某情况下取消这一次查询;这时候只需要定义一个功能切入对象就可以了,在NClay中定义相关对象非常简单只需要实现NClay.MVC.IAspect接口。
[NClay.MVC.ViewAspect(typeof(TestView.OrderListImpl))]
public class OrderListAccept:NClay.MVC.IAspect
{
#region ICustomAccept 成员
public void Aspect(object source, NClay.MVC.AspectHandler e)
{
TestView.OrderListImpl ol = (TestView.OrderListImpl)source;
if (ol.EmployeeID <= 0)
{
Console.WriteLine("Employee is NULL...");
return;
}
e.Execute(source);
}
#endregion
}
[NClay.MVC.ViewAspect(typeof(TestView.OrderListImpl))]描述针对某个视图的切入,也可以根据实际情况的需要定义这个切入对象应用在多个视图或逻辑接口中。所有东西都完成了下面就通过配置文件把这些功能整合起来,框架的配置文件非常清楚简单:
<configSections>
<section name="NClay" type="NClay.FrameWorkConfigHandler, NClay, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</configSections>
<NClay>
<!-- 数据访问配置节
<dal>
<DriverType value="NClay.Data.OledbAccess, NClay.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"/>
<ConnectionString value=""/>
<MappingAssemblys>
<Assembly value="Sales.Model"/>
</MappingAssemblys>
</dal>-->
<!-- MVC Front Controller配置节-->
<mvc>
<controllers>
<Assembly value="TestLogic"/>
</controllers>
<views>
<Assembly value="TestView"/>
</views>
<aspects>
<Assembly value="TestAccept"/>
</aspects>
</mvc>
</NClay>
最后看一下执行的代码和结果:
class Program
{
static void
{
TestView.OrderListImpl ol = new TestView.OrderListImpl();
NClay.MVC.Container.Execute(ol);
Console.WriteLine("-------------------------------");
ol = new TestView.OrderListImpl();
ol.EmployeeID = 5;
NClay.MVC.Container.Execute(ol);
Console.Read();
}
}
Employee is NULL...
-------------------------------
EmployeeID:5
Listed...