跟我学MVC系列(Repository模式、LINQ、EF、IOC框架Castle、JQuery、AJAX)(四)Models(ORM、Repository模式、分页)...



跟我学MVC系列(Repository模式、LINQ、EF、IOC框架Castle、JQuery、AJAX)(三)Models(ORM、Repository模式、分页) (9-3 23:00)
    
跟我学MVC系列(Repository模式、LINQ、EF、IOC框架Castle、JQuery、AJAX)(二)Models(ORM) (9-3 10:43)      
跟我学MVC系列(Repository模式、LINQ、EF、IOC框架Castle、JQuery、AJAX)(一)数据库建模 (9-1 00:04)

今天,我们接上篇。我们在 Repository 文件夹下创建一个类BaseRepositoryBase.cs,这个类是要继承 IRepository 接口,实现里面的方法,这样,就把增删查改方法给抽象出来,以后的类只要继承BaseRepositoryBase.cs,就不用自己去实现啦。
代码如下:
ContractedBlock.gif ExpandedBlockStart.gif Code
using System;
using System.Collections.Generic;
using System.Data.Objects;
using System.Linq;
using PBAccount.Models;

namespace PBAccount.Repository
{
    
/// <summary>
    
/// 
    
/// </summary>
    
/// <typeparam name="T">实体接口</typeparam>
    
/// <typeparam name="TEntity">EF数据类</typeparam>
    
public abstract class BaseRepositoryBase<T, TEntity> : IRepository<T> where TEntity : class
    {
        protected PBAccountEntities1 dataContext;
        
public BaseRepositoryBase(PBAccountEntities1 dataContext)
        {
            this.dataContext 
= dataContext;
        }

        #region IRepository
<T> 成员

        
public virtual void Add(T entity)
        {
            dataContext.AddObject(EntitySetName, ToEntity(entity));
        }

        private string EntitySetName
        {
            get { 
return typeof(TEntity).Name; }
        }

        
public virtual void Del(T entity)
        {
            dataContext.DeleteObject(ToEntity(entity));
        }

        
public virtual void Update(T entity)
        {

        }

        protected ObjectQuery
<TEntity> EntitySet
        {
            get { 
return dataContext.CreateQuery<TEntity>("[" + EntitySetName + "]"); }
        }

        
public IList<T> Find(ICriteria criteria)
        {
            
if (criteria == null)
                throw new ArgumentNullException("criteria");
            
var query = EntitySet.Where(criteria.Expression, criteria.Parameters.Select(p => new ObjectParameter(p.Name, p.Value)).ToArray());

            
return ToList(query);
        }


        
public IList<T> FindAll()
        {
            
return ToList(EntitySet);
        }

        
public IList<T> Find(ICriteria criteria, int page, int pageSize, Order orderExpr)
        {
            
if (criteria == null || orderExpr == null)
                throw new ArgumentNullException("criteria");
            
var query = EntitySet.Where(criteria.Expression, criteria.Parameters.Select(p => new ObjectParameter(p.Name, p.Value)).ToArray());


            
return ToList(orderExpr.OrderFrom<TEntity>(query).Skip((page - 1* pageSize).Take(pageSize));
        }

        
public int Count(ICriteria criteria)
        {
            
if (criteria == null)
                throw new ArgumentNullException("criteria");
            
return EntitySet.Where(criteria.Expression, criteria.Parameters.Select(p => new ObjectParameter(p.Name, p.Value)).ToArray()).Count();
        }

        
public void SaveChanges()
        {
            dataContext.SaveChanges();
        }

        
public virtual T Find(Guid entityId)
        {
            
return Find(new EqualParameterCriteria(EntitySetName + "Id", entityId)).FirstOrDefault();
        }

        protected virtual IList
<T> ToList(IQueryable<TEntity> query)
        {
            
return query.AsEnumerable().Select(x => CreateSqlEntity(x)).Cast<T>().ToList();
        }

        #endregion

        protected abstract T CreateSqlEntity(TEntity x);
        protected abstract TEntity ToEntity(T t);

        #region IRepository
<T> 成员


        
public int GetAccounts(ICriteria criteria, int page, int pageSize, Order orderExpr)
        {
            
if (criteria == null || orderExpr == null)
                throw new ArgumentNullException("criteria");
            
var query = EntitySet.Where(criteria.Expression, criteria.Parameters.Select(p => new ObjectParameter(p.Name, p.Value)).ToArray());


            
return ToList(orderExpr.OrderFrom<TEntity>(query).Skip((page - 1* pageSize).Take(pageSize)).Count;
        }

        #endregion
    }
}

以上就是BaseRepositoryBase.cs。现在提醒你一下啊,我们在Models下面定义了三个实体类接口(IAccount.cs IAccountType.cs IUser.cs )呢,下面我们用EF来对它们实现,你就会发现EF的魅力啦,代码如下啊:      

ContractedBlock.gif ExpandedBlockStart.gif Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using PBAccount.Models;
using PBAccount.Repository.Helper;

namespace PBAccount.Repository
{
    
public class SQLAccount:IAccount
    {
        
internal Accounts account;

        
public SQLAccount()
        {
            
this.account = new Accounts
            {
                AccountID 
= Guid.NewGuid()
            };
        }

        
#region IAccount 成员

        
public Guid AccountID
        {
            
get
            {
                
return account.AccountID;
            }
            
set
            {
                account.AccountID 
= value;
            }
        }

        
public IUser user
        {
            
get
            {
                
if (null == user && null != account)
                {
                    
if (!account.UsersReference.IsLoaded && account.IsInObjectContext())
                    {
                        account.UsersReference.Load();
                    }
                    
if ( null != account.Users)
                    {
                        user 
= new SQLUser(account.Users);
                    }

                }
                
return user;
            }
            
set
            {
                user 
= value;
                account.Users 
= user == null ? null : ((SQLUser)user).user;
            }
        }

        
public bool InOrOut
        {
            
get
            {
                
return (bool)account.InOrOut;
            }
            
set
            {
                account.InOrOut 
= value;
            }
        }

        
public float Amount
        {
            
get
            {
                
return (float)account.Amount;
            }
            
set
            {
                account.Amount 
= value;
            }
        }

        
public IAccountType AccountType
        {
            
get
            {
                
if (null == AccountType && null != account)
                {
                    
if (!account.AccountTypesReference.IsLoaded && account.IsInObjectContext())
                    {
                        account.AccountTypesReference.Load();
                    }
                    
if (null != account.AccountTypes)
                    {
                        AccountType 
= new SQLAccountType(account.AccountTypes);
                    }

                }
                
return AccountType;
            }
            
set
            {
                AccountType 
= value;
                account.AccountTypes 
= AccountType == null ? null : ((SQLAccountType)AccountType).accounttype;
            }
        }

        
public DateTime Time
        {
            
get
            {
                
return (DateTime)account.Time;
            }
            
set
            {
                account.Time 
= value;
            }
        }

        
public AccountStatus Status
        {
            
get
            {
                
return (AccountStatus)account.Status;
            }
            
set
            {
                account.Status 
= (int)value;
            }
        }

        
public string Detail
        {
            
get { return account.Detail == null ? null : Encoding.Default.GetString(account.Detail); }
            
set { account.Detail = value == null ? null : Encoding.Default.GetBytes(value); }
        }

        
#endregion
    }
}



using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using PBAccount.Models;

namespace PBAccount.Repository
{
    
public class SQLUser:IUser
    {
        
internal Users user;
        
public SQLUser(Users user)
        {
            
this.user=user;
        }
        
public SQLUser()
        {
            
this.user = new Users() {
                UserID
=Guid.NewGuid()
            };

        }


        
#region IUser 成员

        
public Guid UserID
        {
            
get
            {
                
return user.UserID;
            }
            
set
            {
                user.UserID 
= value;
            }
        }

        
public string LoginName
        {
            
get
            {
                
return user.LoginName;
            }
            
set
            {
                user.LoginName 
= value;
            }
        }

        
public string Name
        {
            
get
            {
                
return user.Name;
            }
            
set
            {
                user.Name 
= value;
            }
        }

        
public bool Sex
        {
            
get
            {
                
return  (bool)user.Sex;
            }
            
set
            {
                user.Sex 
= value;
            }
        }

        
public DateTime BirthDay
        {
            
get
            {
                
return (DateTime)user.BirthDay;
            }
            
set
            {
                user.BirthDay 
= value;
            }
        }

        
public string Profession
        {
            
get
            {
                
return user.Profession;
            }
            
set
            {
                user.Profession 
= value;
            }
        }

        
public int Role
        {
            
get
            {
                
return (int)user.Role;
            }
            
set
            {
                user.Role 
= value;
            }
        }

        
#endregion
    }
}


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using PBAccount.Models;

namespace PBAccount.Repository.Helper
{
    
public class SQLAccountType:IAccountType
    {
        
internal AccountTypes accounttype;
        
public SQLAccountType()
        {
            
this.accounttype=new AccountTypes(){
            AccountTypeID
=Guid.NewGuid()
            };
        }

        
public SQLAccountType(AccountTypes accouttype)
        {
            
this.accounttype = accouttype;
        }

        
#region IAccountType 成员

        
public Guid AccountTypeID
        {
            
get
            {
                
return accounttype.AccountTypeID;
            }
            
set
            {
                accounttype.AccountTypeID 
= value;
            }
        }

        
public string AccountTypeName
        {
            
get
            {
                
return accounttype.AccountTypeName;
            }
            
set
            {
                accounttype.AccountTypeName 
= value;
            }
        }

        
#endregion
    }
}
上面的代码你可是要仔细分析哦,你是否注意到上面代码中出现了一个 IsInObjectContext()方法, 这个方法又涉及到一个新概念啦,那就是“扩展方法”,详情参阅:http://msdn.microsoft.com/zh-cn/library/bb383977.aspx ,具体我就不说了,你看这个方法名称就基本上知道它的意思啦,主要起到验证的作用。这个扩展方法是如何实现的呢?我们在Repository文件夹下新建了一个Helper文件夹,在Helper文件夹下建立一个ObjectEntityHelper.cs 类,代码如下:
ContractedBlock.gif ExpandedBlockStart.gif Code
using System.Data;
using System.Data.Objects.DataClasses;

namespace PBAccount.Repository.Helper
{
        
static public class ObjectEntityHelper
        {
            
/// <summary>
            
/// 扩展方法 验证所传入的参数类 
            
/// </summary>
            
/// <param name="entity"></param>
            
/// <returns></returns>
            public static bool IsInObjectContext(this EntityObject entity)
            {
                
return entity.EntityState == EntityState.Unchanged || entity.EntityState == EntityState.Modified;
            }
        }
}
OK,现在,我们看看解决方案的截图吧:

看到了这个图,你就会明白现在的项目架构了吧。
这篇就到这儿啦。下篇继续,共同努力啊。

转载于:https://www.cnblogs.com/poorboy/archive/2009/09/05/1560661.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值