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;

namespace TestDomainObject0808


{
public interface IUserData

{

int? ID
{ get; set; }

string Name
{ get; set; }
}
}

UserData.cs
using System;
using System.Collections.Generic;
using System.Text;

namespace TestDomainObject0808


{
public class UserData : IUserData

{

Private Members#region Private Members

private int? _ID;
private string _Name = null;

#endregion


Attributes#region Attributes

public int? ID

{
get

{
return _ID;
}
set

{
_ID = value;
}
}

public string Name

{
get

{
return _Name;
}
set

{
_Name = value;
}
}

#endregion


Constructors#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

{

Private Members#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


Attributes#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


Constructors#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


IPersistable#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

{

Constructors#region Constructors

public ObjectCollection() : base()

{
}

public ObjectCollection(ICondition condition)
: this()

{
Load(condition);
}

#endregion


IPersistable#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