Source Codes in C# 2.0 Format DownloadIn 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;
![](/Images/OutliningIndicators/None.gif)
namespace TestDomainObject0808
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
public interface IUserData
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
int? ID
{ get; set; }
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
string Name
{ get; set; }
}
}
![](/Images/OutliningIndicators/None.gif)
UserData.cs
using System;
using System.Collections.Generic;
using System.Text;
![](/Images/OutliningIndicators/None.gif)
namespace TestDomainObject0808
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
public class UserData : IUserData
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
Private Members#region Private Members
![](/Images/OutliningIndicators/InBlock.gif)
private int? _ID;
private string _Name = null;
![](/Images/OutliningIndicators/InBlock.gif)
#endregion
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
Attributes#region Attributes
![](/Images/OutliningIndicators/InBlock.gif)
public int? ID
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
get
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return _ID;
}
set
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
_ID = value;
}
}
![](/Images/OutliningIndicators/InBlock.gif)
public string Name
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
get
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return _Name;
}
set
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
_Name = value;
}
}
![](/Images/OutliningIndicators/InBlock.gif)
#endregion
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
Constructors#region Constructors
![](/Images/OutliningIndicators/InBlock.gif)
public UserData()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
}
![](/Images/OutliningIndicators/InBlock.gif)
#endregion
}
}
![](/Images/OutliningIndicators/None.gif)
IPersistable.cs
using System;
using System.Collections.Generic;
using System.Text;
![](/Images/OutliningIndicators/None.gif)
namespace TestDomainObject0808
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
public interface IPersistable
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
void Save();
void Load(ICondition condition);
}
}
![](/Images/OutliningIndicators/None.gif)
BaseObject.cs
using System;
using System.Collections.Generic;
using System.Text;
![](/Images/OutliningIndicators/None.gif)
namespace TestDomainObject0808
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
public abstract class BaseObject<ObjectType>
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
public static void BatchUpdate(ICondition condition, ObjectType obj)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
//Only un-null/HasValue attributes will be treated as need-to-update attributes
//![](/Images/dot.gif)
}
}
}
![](/Images/OutliningIndicators/None.gif)
ICondition.cs
using System;
using System.Collections.Generic;
using System.Text;
![](/Images/OutliningIndicators/None.gif)
namespace TestDomainObject0808
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
public interface ICondition
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
//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.
}
}
![](/Images/OutliningIndicators/None.gif)
User.cs
using System;
using System.Collections.Generic;
using System.Text;
![](/Images/OutliningIndicators/None.gif)
namespace TestDomainObject0808
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
public class User : BaseObject<IUserData>, IUserData, IPersistable
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
Private Members#region Private Members
![](/Images/OutliningIndicators/InBlock.gif)
private IUserData _OldData = null;
private IUserData _CurrentData = null;
private void RestoreOldData()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
_CurrentData = new UserData();
_CurrentData.ID = _OldData.ID;
_CurrentData.Name = _OldData.Name;
}
![](/Images/OutliningIndicators/InBlock.gif)
#endregion
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
Attributes#region Attributes
![](/Images/OutliningIndicators/InBlock.gif)
public int? ID
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
get
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return _CurrentData.ID;
}
set
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
_CurrentData.ID = value;
}
}
![](/Images/OutliningIndicators/InBlock.gif)
public string Name
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
get
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return _CurrentData.Name;
}
set
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
_CurrentData.Name = value;
}
}
![](/Images/OutliningIndicators/InBlock.gif)
#endregion
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
Constructors#region Constructors
![](/Images/OutliningIndicators/InBlock.gif)
public User()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
_OldData = new UserData();
RestoreOldData();
}
![](/Images/OutliningIndicators/InBlock.gif)
public User(IUserData ud)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
_OldData = (ud == null? new UserData() : ud);
RestoreOldData();
}
![](/Images/OutliningIndicators/InBlock.gif)
public User(ICondition condition) : this()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
Load(condition);
}
![](/Images/OutliningIndicators/InBlock.gif)
#endregion
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
IPersistable#region IPersistable
![](/Images/OutliningIndicators/InBlock.gif)
public void Save()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
//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.
//![](/Images/dot.gif)
}
![](/Images/OutliningIndicators/InBlock.gif)
public void Load(ICondition condition)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
//Load object data according to specified condition
//![](/Images/dot.gif)
}
![](/Images/OutliningIndicators/InBlock.gif)
#endregion
}
}
![](/Images/OutliningIndicators/None.gif)
ObjectCollection.cs
using System;
using System.Collections.Generic;
using System.Text;
![](/Images/OutliningIndicators/None.gif)
namespace TestDomainObject0808
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
public class ObjectCollection<ObjectType> : List<ObjectType>, IPersistable
where ObjectType : IPersistable
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
Constructors#region Constructors
![](/Images/OutliningIndicators/InBlock.gif)
public ObjectCollection() : base()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
}
![](/Images/OutliningIndicators/InBlock.gif)
public ObjectCollection(ICondition condition)
: this()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
Load(condition);
}
![](/Images/OutliningIndicators/InBlock.gif)
#endregion
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
IPersistable#region IPersistable
![](/Images/OutliningIndicators/InBlock.gif)
public void Save()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
foreach (ObjectType obj in this)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
obj.Save();
}
}
![](/Images/OutliningIndicators/InBlock.gif)
public void Load(ICondition condition)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
this.Clear();
![](/Images/OutliningIndicators/InBlock.gif)
if (condition != null)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
//Load objects according to specified condition
//![](/Images/dot.gif)
}
}
![](/Images/OutliningIndicators/InBlock.gif)
#endregion
}
}
![](/Images/OutliningIndicators/None.gif)
//The End