zoukankan      html  css  js  c++  java
  • Linq to SQL (ALinq) 也来AOP —— ALinq Inject 博客园首发

    简介

    ALinq Inject 是我的又一开源项目,之前已经开源了两个作品:

    ALinq Fluent

    ALinq Dynamic

    这两个开源项目都是托管在 CodePlex 上,而 ALinq Inject 是我本年度的第三个开源项目了。这个项目,我花了几个月的时间去构思,然后再花了差不多一个月的时间去编写,非常不容易,如果你对此感兴趣,请点击一下推荐按钮,也就举手之劳。

    在 Linq to SQL 上使用 AOP 有什么好处?好处太多了。下面列举几个常见的应用情景,在这些情景中,应用AOP,可以使用代码更为优雅。

    1、数据的验证

    2、操作日志

    3、数据更新的记录。

    特点

    简单易用,ALinq Inject 目前能够注入到添加、删除、更新、验证四个方法,下一步将支持查询的注入。

    使用

    1、Linq to SQL 用户,引用 System.Data.Linq.Inject.dll 程序集,如果是 ALinq 用户,则引用 ALinq.Inject.dll 。

    2、创建 HandlerAttribute 的继承类,实现注入。如下:

    class LoggerAttribute : HandlerAttribute
    {
        public override void OnUpdateBegin(object entity, HandlerArguments args)
        {
            Console.WriteLine("============== Begin Update ====================");
        }
    
        public override void OnUpdateSuccess(object entity, HandlerArguments args)
        {
            Console.WriteLine("============== Update Success ====================");
        }
    
        public override void OnUpdateFail(object entity, HandlerExceptionArguments args)
        {
            Console.WriteLine("============== Update Fail ====================");
            Console.WriteLine(args.Exception.Message);
            args.Processed = true;
            Console.WriteLine("===============================================");
        }
    
        public override void OnUpdateEnd(object entity, HandlerArguments args)
        {
            Console.WriteLine("============== Update End ====================");
        }
    
    }

    3、在 DataContext 上类上,加上 LoggerAttribute

    [Logger]
    partial class NorthwindDatabase
    {
    }

    4、使用 InjectMappingSource 类,替代原来的 MappingSource(AttributeMappingSource 或 XmlMappingSource)

    var mappingSource = new InjectMappingSource();
    var db = new NorthwindDemo.NorthwindDatabase(conn, mappingSource)
                    {
                        Log = Console.Out
                    };
    var c = db.Categories.First();
    c.CategoryName = c.CategoryName + "x";
    db.SubmitChanges();

    5、运行后输出的结果

    SELECT TOP (1) [t0].[Category ID] AS [CategoryID], [t0].[Category Name] AS [CategoryName], [t0].[Description], [t0].[Picture]
    FROM [Categories] AS [t0]
    -- Context: SqlProvider(SqlCE) Model: ProxyMetaModel Build: 4.0.30319.17929
    
    ============== Begin Update ====================
    UPDATE [Categories]
    SET [Category Name] = @p1
    WHERE [Category ID] = @p0
    -- @p0: Input Int32 (Size = 0; Prec = 0; Scale = 0) [1]
    -- @p1: Input String (Size = 0; Prec = 0; Scale = 0) [Beveragesxxxx]
    -- Context: SqlProvider(SqlCE) Model: ProxyMetaModel Build: 4.0.30319.17929
    
    ============== Update Success ====================
    ============== Update End ====================

    从输出的结果可以看得到,已经成功注入了。 点击这里下载 ALinq Inject  点击这里下载示例

    感兴趣的朋友,请点击推荐(举手之劳,哥写这个框架可是几个月呀),推荐数超过 100 了,我就继续发详细的教程,还有代码。

     教程在这里。

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

  • 相关阅读:
    Oracle
    Oracle入门
    数据库测试的测试点
    overload重载与override重写的区别
    Java接口的default关键字用法解释
    pytest执行入口
    Gradle的安装与基本配置
    玩转HTML5+跨平台开发[5] HTML表单标签
    玩转HTML5+跨平台开发[4] HTML表格标签
    玩转HTML5+跨平台开发[3] HTML列表标签
  • 原文地址:https://www.cnblogs.com/ansiboy/p/3133123.html
Copyright © 2011-2022 走看看