Castle ActiveRecord学习实践(11)——ActiveRecordMediator
ActiveRecordMediator类也为实体类提供了持久化的方法(CRUD),先来看看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: }