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


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

  • 相关阅读:
    python 单例模式
    socketserver 多进程、多线程应用实例
    socket 编程的一些应用例子
    模拟一个http 请求的json格式报文,带 rsa 签名操作
    python excel基本操作
    多线程 进程间共享变量等
    多线程 multiprocessing 的几个小例子
    mysql 数据库的相关操作
    正则表达式匹配IP地址
    32-服务的容量规划:怎样才能做到有备无患
  • 原文地址:https://www.cnblogs.com/ansiboy/p/3135037.html
Copyright © 2020-2023  润新知