代码改变世界

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

2013-06-14 09:52  麦舒  阅读(1392)  评论(5编辑  收藏  举报

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的运行机制,以及设计准则,一定会让研究架构的朋友大呼过瘾。感兴趣的朋友,可以关注我的腾讯微博。