zoukankan      html  css  js  c++  java
  • [ActiveRecord] 之ActiveRecordMediator

    http://www.rainsts.net/article.asp?id=243
    有意无意的,很多文章都没有提及 ActiveRecordMediator 。

    ActiveRecordMediator最大的用途是:即便你的实体类不是继承自 ActiveRecordBase (不推荐这么做),它也可以进行同等的创建、查找等操作;另外这个类实现了很多常用的方法,我们直接使用它就没必要为每个实体类写一堆相同的操作方法了(ActiveRecordBase的静态方法干吗声明为 protected internal?)。

    [ActiveRecord]
    public class User
    {
      private int id;

      [PrimaryKey(PrimaryKeyType.Identity)]
      public int Id
      {
        get { return id; }
        set { id = value; }
      }
    }

    public static void Test()
    {
      ActiveRecordMediator.Create(new User());
    }


    看看下面的类型定义,方法是不是很多?

    public class ActiveRecordMediator
    {
      public ActiveRecordMediator();
      public static void Create(object instance);
      public static void Delete(object instance);
      public static void DeleteAll(Type type);
      public static void DeleteAll(Type type, string where);
      public static object Execute(Type targetType, NHibernateDelegate call, object instance);
      public static object ExecuteQuery(IActiveRecordQuery q);
      public static Array FindAll(Type targetType);
      public static Array FindAll(Type targetType, params ICriterion[] criterias);
      public static Array FindAll(Type targetType, Order[] orders, params ICriterion[] criterias);
      public static object FindByPrimaryKey(Type targetType, object id);
      public static object FindByPrimaryKey(Type targetType, object id, bool throwOnNotFound);
      public static ISessionFactoryHolder GetSessionFactoryHolder();
      public static void Save(object instance);
      public static Array SlicedFindAll(Type targetType, int firstResult, int maxresults, params ICriterion[] criterias);
      public static Array SlicedFindAll(Type targetType, int firstResult, int maxresults, Order[] orders, params ICriterion[] criterias);
      public static void Update(object instance);
    }


    当然,Castle 还提供了ActiveRecordMediator<T> 和ActiveRecordBase<T>这两个泛型实现,但不知道为什么没有直接继承自ActiveRecordMediator和ActiveRecordBase,而且还少了一些实用的方法。看来鱼和熊掌不能兼得,当然你可以自己修改代码来的兼而并之。

    在ActiveRecordMediator的多个方法中都使用了ICriterion接口,其真正实现是NHibernate.Expression名字空间。我们可以Expression静态类生成许多查询条件。

    // 分页查询 (查询100<=id<200 的用户对象集合,返回第1页,每页10条记录)

    ActiveRecordMediator.SlicedFindAll(typeof(User), 0, 10, Expression.Between("id", 100, 200));
  • 相关阅读:
    [C++] 重载运算符与类型转换(1)
    [C++] 重载new和delete——控制内存分配
    [C++] 空间配置器——allocator类
    [C++] C++中的宏定义详解
    [C++] 类中的静态成员
    [Leetcode][动态规划] 第935题 骑士拨号器
    [Leetcode][动态规划] 第931题 下降路径最小和
    Pyinstaller打包django
    Python小技巧:运行目录或ZIP文件
    python实现简单动画——生命游戏
  • 原文地址:https://www.cnblogs.com/easyleo/p/3193865.html
Copyright © 2011-2022 走看看