• Domain Object Layer Design and Sample Code for LiteMDA


    Source Codes in C# 2.0 Format Download

    In these sample codes, BaseObject.cs, ICondition.cs, IPersistable.cs and ObjectCollection.cs are shared classes are for all Domain Objects. And IUserData.cs, UserData.cs and User.cs represent a Domain Object “User”, mapping to Table “User” in a RDB when using a RDB.

    Sample Domain Object “User” and “ObjectCollection<User>” (C# 2.0 Generic Style Class) represent a single user and user’s collection. They are all inheriting IPersistable, so need to implementing “Save” and “Load” methods of IPersistable. Class “User” inherits BaseObject<UserData> which provides “User” the special custom batch Update support.

    With the help of the following four methods, we can do all kinds of “Read” and “Write” to “User”: User.Save, User.Load, ObjectCollection<User>.Save, ObjectCollection<User>.Load and BaseObject<UserData>.BatchUpdate.

    And with the benefit of C# 2.0’s Generic, codes become more clearly than un-generic style implementing.

    IUserData.cs

    using System;
    using System.Collections.Generic;
    using System.Text;

    namespace TestDomainObject0808
    {
        
    public interface IUserData
        
    {
            
    int? ID getset; }
            
    string Name getset; }
        }

    }


    UserData.cs

    using System;
    using System.Collections.Generic;
    using System.Text;

    namespace TestDomainObject0808
    {
        
    public class UserData : IUserData
        
    {
            
    #region Private Members

            
    private int? _ID;
            
    private string _Name = null;

            
    #endregion


            
    #region Attributes

            
    public int? ID
            
    {
                
    get
                
    {
                    
    return _ID;
                }

                
    set
                
    {
                    _ID 
    = value;
                }

            }


            
    public string Name
            
    {
                
    get
                
    {
                    
    return _Name;
                }

                
    set
                
    {
                    _Name 
    = value;
                }

            }


            
    #endregion


            
    #region Constructors

            
    public UserData()
            
    {
            }


            
    #endregion

        }

    }


    IPersistable.cs

    using System;
    using System.Collections.Generic;
    using System.Text;

    namespace TestDomainObject0808
    {
        
    public interface IPersistable
        
    {
            
    void Save();
            
    void Load(ICondition condition);
        }

    }


    BaseObject.cs

    using System;
    using System.Collections.Generic;
    using System.Text;

    namespace TestDomainObject0808
    {
        
    public abstract class BaseObject<ObjectType>
        
    {
            
    public static void BatchUpdate(ICondition condition, ObjectType obj)
            
    {
                
    //Only un-null/HasValue attributes will be treated as need-to-update attributes
                
    //
            }

        }

    }

    ICondition.cs

    using System;
    using System.Collections.Generic;
    using System.Text;

    namespace TestDomainObject0808
    {
        
    public interface ICondition
        
    {
            
    //ICondition will be OO style, and should be either designtime static definition 
            
    //in configuration file or runtime dynamically constructed ones in codes or 
            
    //free combinations of them.
        }

    }

    User.cs

    using System;
    using System.Collections.Generic;
    using System.Text;

    namespace TestDomainObject0808
    {
        
    public class User : BaseObject<IUserData>, IUserData, IPersistable
        
    {
            
    #region Private Members

            
    private IUserData _OldData = null;
            
    private IUserData _CurrentData = null;
            
    private void RestoreOldData()
            
    {
                _CurrentData 
    = new UserData();
                _CurrentData.ID 
    = _OldData.ID;
                _CurrentData.Name 
    = _OldData.Name;
            }


            
    #endregion


            
    #region Attributes

            
    public int? ID
            
    {
                
    get
                
    {
                    
    return _CurrentData.ID;
                }

                
    set
                
    {
                    _CurrentData.ID 
    = value;
                }

            }


            
    public string Name
            
    {
                
    get
                
    {
                    
    return _CurrentData.Name;
                }

                
    set
                
    {
                    _CurrentData.Name 
    = value;
                }

            }


            
    #endregion


            
    #region Constructors

            
    public User()
            
    {
                _OldData 
    = new UserData();
                RestoreOldData();
            }


            
    public User(IUserData ud)
            
    {
                _OldData 
    = (ud == null? new UserData() : ud);
                RestoreOldData();
            }


            
    public User(ICondition condition) : this()
            
    {
                Load(condition);
            }


            
    #endregion


            
    #region IPersistable

            
    public void Save()
            
    {
                
    //Save()'s implementing denpending on the configuration setting for current DO's primary key and user defined type attributes;
                
    //If _CurrentData.PK == null then do Creating New Object in persisting;
                
    //else _CurrentData.PK != null then do Updating Object in persisting.
                
    //When do Updating Object, compare the _OldData and _CurrentData's Attributes' values, and 
                
    //dynamically construct minimal update operation.
                
    //For user defined type attributes, need do recursively Saving on attributes of this kind.
                
    //
            }


            
    public void Load(ICondition condition)
            
    {
                
    //Load object data according to specified condition
                
    //
            }


            
    #endregion

        }

    }

    ObjectCollection.cs

    using System;
    using System.Collections.Generic;
    using System.Text;

    namespace TestDomainObject0808
    {
        
    public class ObjectCollection<ObjectType> : List<ObjectType>, IPersistable
            where ObjectType : IPersistable
        
    {
            
    #region Constructors

            
    public ObjectCollection() : base()
            
    {
            }


            
    public ObjectCollection(ICondition condition)
                : 
    this()
            
    {
                Load(condition);
            }


            
    #endregion


            
    #region IPersistable

            
    public void Save()
            
    {
                
    foreach (ObjectType obj in this)
                
    {
                    obj.Save();
                }

            }


            
    public void Load(ICondition condition)
            
    {
                
    this.Clear();

                
    if (condition != null)
                
    {
                    
    //Load objects according to specified condition
                    
    //
                }

            }


            
    #endregion

        }

    }

    //The End

     

  • 相关阅读:
    信号与系统快速学习
    强化学习1
    微积分学习
    最优化学习4
    黑苹果安装显卡驱动、CUDA、cudnn
    Pandas处理txt文件(去重复行, 过滤行)
    xml -> dict
    数据结构与算法(四) --- 排序
    数据结构与算法(三) --- 链表
    数据结构与算法(二) --- 全排列、全组合
  • 原文地址:https://www.cnblogs.com/teddyma/p/209933.html
Copyright © 2020-2023  润新知