dhl:vs2010 -EF4.0 数据层: 通过反射返回泛型的工厂

最近用vs2010做项目,想到了数据层Linq To Entity的实现和以后的扩展,想以接口的形式实现。

总体架构图:

数据层Data:

普通的数据操作数据层:

接口IUserRepository:

 

public interface IUserRepository
{
IList
<UserAccount> GetCommonInterestsUser(int UIN);
void AddUser();
....
}

接口的实现类UserRepository:

public class UserRepository:IUserRepository
    {
        private TaoXueDBEntities _TaoXueDBEntities = new TaoXueDBEntities();
        public IList<UserAccount> GetCommonInterestsUser(int UIN)
        {
            return _TaoXueDBEntities.GetMyLike(UIN).ToList();
        }
    }

 

工厂:

 public class RepositoryFactory
    {
        private readonly IDictionary<String, Object> factory = new Dictionary<String, Object>();
        /// <summary>
        /// 获取用户Repository 
        /// </summary>
        /// <returns>用户仓储接口</returns>
        public IUserRepository GetUserRepository()
        {
            string className = "Taoxue.Data.UserRepository";
            if (factory.ContainsKey(className)) return factory[className] as UserRepository;
            IUserRepository repo = Activator.CreateInstance(Type.GetType(className)) as IUserRepository;
            factory.Add(className, repo);
            return repo;
        }
}
 

 

泛型的数据接口:

 

代码
public interface IRepository<T> where T : class
{
int Add(T entity);
int Count(ICriteria criteria);
int Delete(T entity);
int ExecuteStoreCommand(string commandText, params ObjectParameter[] paramete);
ObjectResult
<T> ExecuteStoreQuery(string commandText, params ObjectParameter[] paramete);
IList
<T> Find(ICriteria criteria, int page, int pageSize, OrderBy orderExpr);
IList
<T> FindAll();
IList
<T> FindAll(Func<T, bool> exp);
ObjectSet
<T> FindQuerySet() ;
ObjectContext GetObjectContext();
ObjectQuery
<T> GetQuery(string query, params ObjectParameter[] parameter);
int SaveChanges();
int Update(T entity);
}

 

泛型的实现类:

 public class Repository<T> : IRepository<T> where T : class
    {

        private ObjectContext _objectContext = null;
        #region objectContext
        /// <summary>
        /// 获得提供用于查询和使用对象形式的实体数据功能
        /// </summary>
        /// <returns>数据库上下文</returns>
        public virtual ObjectContext GetObjectContext()
        {
            return new TaoXueDBEntities();
        }
        #endregion


        public Repository()
        {
        }
        /// <summary>
        /// 按条件查询所有对象
        /// </summary>
        /// <param name="exp">表达式</param>
        /// <returns>查询结果</returns>
        public IList<T> FindAll(Func<T, bool> exp)
        {
            using (var objectContext = GetObjectContext())
            {
                var result = objectContext.CreateObjectSet<T>().Where(exp).ToList();
                return result;
            }
        }
        /// <summary>
        /// 返回所有对象
        /// </summary>
        /// <returns></returns>
        public IList<T> FindAll()
        {
            using (var objectContext = GetObjectContext())
            {
                var v = objectContext.CreateObjectSet<T>();
                return v.ToList();
            }
        }
        /// <summary>
        /// 获取数据集实例,用于查询,修改,添加,删除
        /// </summary>
        /// <returns></returns>
        public ObjectSet<T> FindQuerySet()
        {
            if (_objectContext == null)
            {
                _objectContext = GetObjectContext();
            }

            var result = _objectContext.CreateObjectSet<T>();
            return result;
        }

        /// <summary>
        /// ESQL查询,绑定了EF框架
        /// </summary>
        /// <param name="query">ESQL语句</param>
        /// <param name="parameter">参数(可选)</param>
        /// <returns></returns>
        public ObjectQuery<T> GetQuery(string query, params ObjectParameter[] parameter)
        {
            using (var objectContext = GetObjectContext())
            {
                var result = objectContext.CreateQuery<T>(query, parameter);
                return result;
            }
        }
        /// <summary>
        /// 执行数据源语句(如SQL),返回影响的行数
        /// </summary>
        /// <param name="commandText">查询语句</param>
        /// <param name="parameter">参数(可选)</param>
        /// <returns></returns>
        public int ExecuteStoreCommand(string commandText, params ObjectParameter[] paramete)
        {
            if (string.IsNullOrEmpty(commandText))
            {
                return -1;
            }
            using (var objectContext = GetObjectContext())
            {
                var result = objectContext.ExecuteStoreCommand(commandText, paramete);
                return result;
            }
        }
        /// <summary>
        /// 执行数据源查询语句(如SQL),获得数据查询列表
        /// </summary>
        /// <param name="commandText">查询语句</param>
        /// <param name="parameter">参数(可选)</param>
        /// <returns></returns>
        public ObjectResult<T> ExecuteStoreQuery(string commandText, params ObjectParameter[] paramete)
        {
            using (var objectContext = GetObjectContext())
            {
                var result = objectContext.ExecuteStoreQuery<T>(commandText, paramete);
                return result;
            }
        }
       
        /// <summary>
        /// 添加对象
        /// </summary>
        /// <param name="entity"></param>
        /// <returns>修改成功的对象数</returns>
        public int Add(T entity)
        {
            using (var objectContext = GetObjectContext())
            {
                objectContext.CreateObjectSet<T>().AddObject(entity);
                var result = objectContext.SaveChanges();
                return result;
            }
        }
        /// <summary>
        /// 删除对象
        /// </summary>
        /// <param name="entity">将被删除的对象</param>
        /// <returns>删除的数量</returns>
        public int Delete(T entity)
        {
            //objectContext.Attach(entity);            
            using (var objectContext = GetObjectContext())
            {
                try
                {
                    objectContext.CreateObjectSet<T>().Attach(entity);
                    objectContext.CreateObjectSet<T>().DeleteObject(entity);
                }
                catch (Exception e)
                {
                    //todo:log it e
                }
                var result = objectContext.SaveChanges();
                return result;
            }
        }
        /// <summary>
        /// 提交所有修改
        /// </summary>
        public int SaveChanges()
        {
            if (_objectContext != null)
                return _objectContext.SaveChanges();
            else
                return -1;
        }
        /// <summary>
        /// 更新对象
        /// </summary>
        /// <param name="entity"></param>
        /// <returns></returns>
        public int Update(T entity)
        {
            using (var objectContext = GetObjectContext())
            {
                objectContext.CreateObjectSet<T>().Attach(entity);                  
                //objectContext.SetAllModified(entity);
                objectContext.ObjectStateManager.ChangeObjectState(entity, EntityState.Modified);//EF4 新语法
                try
                {
                    var result = objectContext.SaveChanges();
                    return result;
                }
                catch (OptimisticConcurrencyException e)
                {
                    objectContext.Refresh(RefreshMode.ClientWins, entity); // Last in wins
                    //logger.Write(e);
                    var result = objectContext.SaveChanges();
                    return result;
                }
            }

            //using (var ctx = new AdventureWorksEntities())
            //{
            //    // 先 ApplyChanges() 再 ChangeObjectState(), ChangeRelationshipState()
            //    ctx.ProductCategories.ApplyChanges(category);
            //    ctx.ObjectStateManager.ChangeObjectState(category, EntityState.Modified);

            //    return ctx.SaveChanges();
            //}
        }
}

 

 

工厂RepositoryFactory:

 

代码
public class RepositoryFactory
{
private readonly IDictionary<String, Object> factory = new Dictionary<String, Object>();

#region RepositoryFactory 为单例
/// <summary>
/// RepositoryFactory 为单例模式
/// </summary>
private static RepositoryFactory Instance;
private RepositoryFactory()
{
}
/// <summary>
/// 获取Repository工厂实例
/// </summary>
/// <returns>Repository工厂实例</returns>
public static RepositoryFactory GetInstance()
{
if (Instance == null) Instance = new RepositoryFactory();
return Instance;
}
#endregion

#region 工厂方法:通过反射返回泛型数据操作接口的实现类
/// <summary>
/// 获取实体类的Repository的接口IRepository
/// </summary>
/// <typeparam name="T">实体Entity</typeparam>
/// <returns>泛型IRepository</returns>
public IRepository<T> GetRepository<T>() where T : class
{
Type t
= typeof(T);
if (factory.ContainsKey("Repository" + t.FullName)) return factory["Repository" + t.FullName] as IRepository<T>;
string className = "Taoxue.Data.Repository`1";
className
+= "[[" + t.FullName + "," + t.Assembly.FullName + "]]";
Type type
= Type.GetType(className);
IRepository
<T> repo = Activator.CreateInstance(type) as IRepository<T>;
factory.Add(
"Repository" + t.FullName, repo);
return repo;
}
#endregion

#region 工厂方法:通过反射返回其他数据操作接口的实现类
/// <summary>
/// 获取用户Repository
/// </summary>
/// <returns>用户仓储接口</returns>
public IUserRepository GetUserRepository()
{
string className = "Taoxue.Data.UserRepository";
if (factory.ContainsKey(className)) return factory[className] as UserRepository;
IUserRepository repo
= Activator.CreateInstance(Type.GetType(className)) as IUserRepository;
factory.Add(className, repo);
return repo;
}

public ITaokeRepository GetTaoxueRepository()
{
const string className = "Taoxue.Data.TaokeRepository";
if (factory.ContainsKey(className)) return factory[className] as ITaokeRepository;
var repo
= Activator.CreateInstance(Type.GetType(className)) as ITaokeRepository;
factory.Add(className, repo);
return repo;
}
#endregion
}

 

  上层业务的调用:

            IRepository<Lesson> repository = RepositoryFactory.GetInstance().GetRepository<Lesson>();
            IList<Lesson> listAll = repository.FindAll();
            return listAll;

 

posted @ 2010-09-16 11:06  肚肚  阅读(1912)  评论(6编辑  收藏  举报