Castle ActiveRecord学习实践(11)——ActiveRecordMediator

ActiveRecordMediator类也为实体类提供了持久化的方法(CRUD),先来看看ActiveRecordMediator中的方法

ActiveRecordMediator

ActiveRecordMediator类实现了很多常用的方法。包括 Create、Delete、FindOne、FindAll、FindByPrimaryKey、Save、SlicedFindAll、Update等。

基本操作

   1:  // Create
   2:  Customer c = new Customer();
   3:  c.Name = "Mr. Johnson";
   4:  c.Address = String.Empty;
   5:  ActiveRecordMediator<Customer>.Save(c);
   6:   
   7:  // Read/Update
   8:  Customer loaded = ActiveRecordMediator<Customer>.FindOne(Expression.Eq("Name", "Mr. Johnson"));
   9:  loaded.Address = "Middle of the Road";
  10:  ActiveRecordMediator<Customer>.Save(loaded);
  11:   
  12:  // Delete
  13:  ActiveRecordMediator<Customer>.Delete(c);

验证支持

   1:  // Entity
   2:  [ActiveRecord]
   3:  public class Customer
   4:  {
   5:          private Guid id;
   6:   
   7:          [PrimaryKey(PrimaryKeyType.GuidComb)]
   8:          public Guid Id
   9:          {
  10:                  get { return id; }
  11:                  set { id = value; }
  12:          }
  13:          private string name;
  14:   
  15:          [Property(Unique=true,NotNull=true)]
  16:          [ValidateNonEmpty]
  17:          [ValidateIsUnique]
  18:          public string Name
  19:          {
  20:                  get { return name; }
  21:                  set { name = value; }
  22:          }
  23:          private string address;
  24:   
  25:          [Property(NotNull=true)]
  26:          [ValidateNonEmpty]
  27:          public string Address
  28:          {
  29:                  get { return address; }
  30:                  set { address = value; }
  31:          }
  32:  }    
  33:   
  34:  // using code
  35:  Customer c = new Customer();
  36:  c.Name = "Mr. Johnson";
  37:  c.Address = String.Empty;
  38:   
  39:  IValidatorRunner runner = 
  40:          new ValidatorRunner(new CachedValidationRegistry());
  41:  if (runner.IsValid(c))
  42:          ActiveRecordMediator<Customer>.Save(c);
  43:  else
  44:          foreach (string msg in runner.GetErrorSummary(c).ErrorMessages)
  45:                  Console.WriteLine(msg);

利用ActiveRecordMediator类实现Repository模式

ActiveRecordMediator类提供了SlicedFindAll方法,可以用此方法处理数据分页。

首先创建IRepository接口

   1:  public interface IRepository<T>
   2:  {
   3:      void Save(T item);
   4:      void Remove(T item);
   5:      T FindById(object id);
   6:      T FindOne(params ICriterion[] criteria);
   7:      IEnumerable<T> FindBy(params ICriterion[] criteria);
   8:      IEnumerable<T> FindBy(out int count, params ICriterion[] criteria);
   9:      IEnumerable<T> FindBy(int pageSize, int pageCount,NHibernate.Criterion.Order[] order,out int count, params ICriterion[] criteria);
  10:  }
  11:   

接口中包含了基本的Create,Update,Delete,Find方法,还包含了给定条件查询单体,给定条件查询list

创建一个BaseRepository类

   1:  public class BaseRepository<T> : IRepository<T> where T : class
   2:  {
   3:      protected ActiveRecordMediator<T> mediator;
   4:      public virtual void Save(T item)
   5:      {
   6:          ActiveRecordMediator<T>.Save(item);
   7:      }
   8:   
   9:      public virtual void Remove(T item)
  10:      {
  11:          ActiveRecordMediator<T>.Delete(item);
  12:      }
  13:   
  14:      public virtual T FindById(object id)
  15:      {
  16:          return ActiveRecordMediator<T>.FindByPrimaryKey(id);
  17:      }
  18:   
  19:      public virtual T FindOne(params NHibernate.Criterion.ICriterion[] criteria)
  20:      {
  21:          return ActiveRecordMediator<T>.FindOne(criteria);
  22:      }
  23:   
  24:      public virtual IEnumerable<T> FindBy(params NHibernate.Criterion.ICriterion[] criteria)
  25:      {
  26:          return ActiveRecordMediator<T>.FindAll(criteria);
  27:      }
  28:   
  29:      public virtual IEnumerable<T> FindBy(int pageSize, int pageCount, NHibernate.Criterion.Order[] order, out int count, params NHibernate.Criterion.ICriterion[] criteria)
  30:      {
  31:          int _Count = 0;
  32:          _Count = ActiveRecordMediator<T>.FindAll(criteria).Count();
  33:          count = _Count;
  34:          return (IEnumerable<T>)ActiveRecordMediator<T>.SlicedFindAll(typeof(T), (pageSize - 1) * pageCount, pageCount, order, criteria);
  35:         
  36:      }
  37:   
  38:   
  39:      public virtual IEnumerable<T> FindBy(out int count, params NHibernate.Criterion.ICriterion[] criteria)
  40:      {
  41:          int _Count = 0;
  42:          _Count = ActiveRecordMediator<T>.FindAll(criteria).Count();
  43:          count = _Count;
  44:          return ActiveRecordMediator<T>.FindAll(criteria);
  45:      }
  46:  }
  47:   
  48:   

创建Customer的资源库契约的具体实现类CustomerRepository

   1:  public class CustomerRepository : BaseRepository<Customer>
   2:  {
   3:      public override void Save(Customer item)
   4:      {
   5:          base.Save(item);
   6:      }
   7:      public override void Remove(Customer item)
   8:      {
   9:          base.Remove(item);
  10:      }
  11:      public override Customer FindById(object id)
  12:      {
  13:          return base.FindById(id);
  14:      }
  15:   
  16:      public override Customer FindOne(params NHibernate.Criterion.ICriterion[] criteria)
  17:      {
  18:          return base.FindOne(criteria);
  19:      }
  20:      public override IEnumerable<Customer> FindBy(params NHibernate.Criterion.ICriterion[] criteria)
  21:      {
  22:          return base.FindBy(criteria);
  23:      }
  24:   
  25:      public override IEnumerable<Customer> FindBy(out int count, params NHibernate.Criterion.ICriterion[] criteria)
  26:      {
  27:          return base.FindBy(out count, criteria);
  28:      }
  29:   
  30:      public override IEnumerable<Customer> FindBy(int pageSize, int pageCount, NHibernate.Criterion.Order[] order, out int count, params NHibernate.Criterion.ICriterion[] criteria)
  31:      {
  32:          return base.FindBy(pageSize, pageCount, order, out count, criteria);
  33:      }
  34:  }
  35:   
  36:   

调用

   1:  int count=0;
   2:  var list1 = dal.FindBy(
   3:                  1,
   4:                  10,
   5:                  new[] { NHibernate.Criterion.Order.Desc("id") },
   6:                  out count, NHibernate.Criterion.Expression.Between("Age",20, 30));
   7:  foreach (var item in list1)
   8:  {
   9:      Response.Write(item.Id+"</br>");
  10:  }
posted @ 2013-01-05 22:44  Ian.w  阅读(504)  评论(0编辑  收藏  举报