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