Linq to SQL 也来AOP 之 —— ALinq Inject 使用指南

原帖地址:http://www.cnblogs.com/ansiboy/archive/2013/06/14/3135037.html

ALinq Inject 是一个可以对 Linq to SQL 或者 ALinq 进行注入的框架,它可以对四个方法进行注入,添加实体、删除实体、更新实体和验证实体。


关于框架的下载以及程序集的引用,请查看 Linq to SQL (ALinq) 也来AOP —— ALinq Inject 博客园首发 。


ALinq Inject 是一个非常之简单易用的框架,你只需要通过继承HandlerAttribute 的类,重写其中的方法即可注入。该类一共定义了13个方法,其中三组是增删改的方法,每组四个。验证方法仅有一个。



public abstract class HandlerAttribute : Attribute
{
public virtual void OnInsertBegin(object entity, HandlerArguments args);
public virtual void OnInsertEnd(object entity, HandlerArguments args);
public virtual void OnInsertSuccess(object entity, HandlerArguments args);
public virtual void OnInsertFail(object entity, HandlerFailArguments args);

public virtual void OnUpdateBegin(object entity, HandlerArguments args);
public virtual void OnUpdateEnd(object entity, HandlerArguments args);
public virtual void OnUpdateSuccess(object entity, HandlerArguments args);
public virtual void OnUpdateFail(object entity, HandlerFailArguments args);

public virtual void OnDeleteBegin(object entity, HandlerArguments args);
public virtual void OnDeleteEnd(object entity, HandlerArguments args);
public virtual void OnDeleteSuccess(object entity, HandlerArguments args);
public virtual void OnDeleteFail(object entity, HandlerFailArguments args);

public virtual void OnValidate(object entity, ValidateArguments args);
}


通过名称,我们很容易知道,OnInsertBegin 是注入到 Insert 实体之前的,OnInsertSuccess 是注入到成功 Insert 实体后的,OnInsertFail 是注入到Insert 实体失败后的,OnInsertEnd 则是Insert操作结束,不管是否引发异常,OnInsertEnd 都会执行。对于其它函数,也同样。OnValidate 则是用来注入到验证实体的。


HandlerAttribute放在哪里


在上一篇文章的,实现了 LoggerAttribute 这个类, 并且为 NorthwindDatabase 这个类添加了 Logger 这个特性。如下:



[Logger]
partial class NorthwindDatabase:DataContext
{
}


但是事实上,你也可以将 Logger 这个特性添加到实体类。如下:



[Logger]
public
partial class Category
{
}


这两有什么区别呢?添加到 NorthwindDatabase 则对所有实体类的操作都有效,添加到 Category 实体类,则仅对 Category 实体进行操作才有效。两个地都添加了,那么对于 Category 类,将会执行两次操作。


HandlerArguments



public class HandlerArguments
{
public DataContext DataContex { get; internal set; }
public MetaTable MetaTable { get; internal set; }
}


 你可以通过重载方法中 args 参数来获得当前操作的上下文信息。关于该参数的成员:


DataContext:执行该操作的数据上下文


MetaTable:与该操作相关的元表。


HandlerFailArguments 参数



public class HandlerFailArguments : HandlerArguments
{
public Exception Exception { get; internal set; }
public bool Processed { get; set; }
}


 当执行某个操作操失败时,将会调用 OnXXXXFail 方法,通该方法的 args 参数,你可以获得关于操作失败的信息。其中:


Exception: 指的是操作失败引发的异常


Processed:你可以对该属性进行赋值,当赋值为 true 时,Exception 则不会抛出。


ValidateArguments



public class ValidateArguments
{
public ChangeAction ChangeAction { get; internal set; }
}


 ChangeAction:通过该参数,可以获得当前的操作类型(Insert、Update 或 Delete)。


关于数据的验证


对于实体的验证,是否可以放在 OnBeginInsert、OnBeginUpdate、OnBeginDelete 这些方法呢?


尽管可以,但是关于数据的验证,建议放在 OnValidate 方法内,它有下面这些好处:


1、代码更为清晰,很容易让人知道这些方法是用于验证的。


2、在调用 OnValidate 方法,连接是处于未打开的状态。不会占数据库连接的资源。即 OnBeginInsert、OnBeginUpdate、OnBeginDelete 这些方法,数据库连接都是处于打开的状态。


 


由于 ALinq Inject 实在是太简单易用了,短短一篇文章基本上就介绍完了。如果有不清楚的,或者任何建议,欢迎和我联系。


 


另外:



我现在准备动手写个长篇系列文章,内容是关于Linq to SQL的,和市面上文章的不同的地方是,我会基于设计的角度去写,让你深入地了解Linq to SQL的运行机制,以及设计准则,一定会让研究架构的朋友大呼过瘾。感兴趣的朋友,可以关注我的腾讯微博。 



 


 


 


 

本文链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值