天天看點

LINQ TO SQL的ORM模型構架,實作DATA層的方法!

#region 簡單資料層代碼,足可以說明面向接口的程式設計思想,一種思想的提高才是真正的提升 
    /// <summary> 
    /// 簡單資料工廠 
    /// </summary> 
    internal class Factory 
    { 
        volatile static Dictionary<Thread, DataContext[]> divDataContext = new Dictionary<Thread, DataContext[]>(); 
        static System.Timers.Timer t = new System.Timers.Timer(1000); 
        static Factory() 
        { 
            t.AutoReset = true; 
            t.Enabled = true; 
            t.Elapsed += new System.Timers.ElapsedEventHandler(t_Elapsed); 
            t.Start(); 
        } 
        static void t_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
        { 

            List<Thread> list = new List<Thread>(); 
            list.AddRange(divDataContext.Keys.Where(i => i.ThreadState == ThreadState.Stopped)); 
            for (int index = 0; index < list.Count; index++) 
            { 
                for (int refer = 0; refer < divDataContext[list[index]].Length; refer++) 
                { 
                    if (divDataContext[list[index]][refer] != null) 
                    { 
                        divDataContext[list[index]][refer].Dispose(); 
                        divDataContext[list[index]][refer] = null; 
                    } 
                } 
                divDataContext.Remove(list[index]); 
                list[index] = null; 
            } 
            list = null; 
        } 
        internal static DataContext CreateDb(string dbName) 
        { 
            return CreateDb(dbName, Thread.CurrentThread); 
        } 

        internal static DataContext CreateDb(string dbName, Thread thread) 
        { 
            if (!divDataContext.Keys.Contains(thread)) //如果不包含目前線程,就建立一個 
            { 
                divDataContext.Add(thread, new DataContext[1]); 
            } 

            if (dbName.Equals("lawyer")) 
            { 
                if (divDataContext[thread][0] == null) 
                { 
                    divDataContext[thread][0] = new DataClasses1DataContext(); 
                } 
                return divDataContext[thread][0]; 
            } 

            return null; 
        } 
    } 
    /// <summary> 
    /// 簡單資料基類 
    /// </summary> 
    public abstract class DbBase 
    { 
        protected DataClasses1DataContext db = (DataClasses1DataContext)Factory.CreateDb("lawyer"); 
    } 

    /// <summary> 
    /// 簡單資料實體接口 
    /// </summary> 
    public interface IDataEntity 
    { 

    } 
    /// <summary> 
    /// 簡單資料操作通用方法 
    /// </summary> 
    public interface IRepository 
    { 
        void insert(IDataEntity entity); 

    } 
    #endregion 

    #region 具體規範與實作 

    /// <summary> 
    /// 簡單資料操作規範 
    /// </summary> 
    public interface IUsersRepository : IRepository 
    { 
        //自己的私有規範 
        IQueryable<Users> GetDetails(); 
    } 
    /// <summary> 
    /// 簡單資料操作對象 
    /// </summary> 
    public class UsersRepository : DbBase, IUsersRepository 
    { 

        #region IUsers 成員 

        public IQueryable<Users> GetDetails() 
        { 
            return base.db.Users; 
        } 

        #endregion 

        #region IRepository 成員 

        public void insert(IDataEntity entity) 
        { 
            throw new NotImplementedException(); 
        } 

        #endregion 
    } 


    public interface IRole_UsersRepository : IRepository 
    { 
        IQueryable<Role_Users> GetDetails(); 
    } 
    public class Role_UsersRepository : DbBase, IRole_UsersRepository 
    { 
        #region IRole_UsersRepository 成員 

        public IQueryable<Role_Users> GetDetails() 
        { 
            return base.db.Role_Users; 
        } 

        #endregion 

        #region IRepository 成員 

        public void insert(IDataEntity entity) 
        { 
            throw new NotImplementedException(); 
        } 

        #endregion 
    } 

    #endregion