Sunday, October 28, 2007

Design Patterns #6 - ActiveRecord

Design Patterns #6 - ActiveRecord

Across here Colin MacKay has a good posting about using the Data Abstraction Layer pattern (DAL). That got me thinking, since I’m a bear of little brain, I like to keep things simple. A simpler pattern than DAL is the ActiveRecord pattern where the database function is a responsibility of the business object. This pattern (implemented below) is suitable for departmental (or smaller) scale applications.

namespace garyshort.org.patterns.activerecord
{
///
/// GS - ActiveRecord implementation
///

public class ActiveRecord
{
private int _Id = 0;

public int Id
{
get { return _Id; }
set { _Id = value; }
}

public void Save()
{
if (_Id > 0)
{
Update();
}

else
{
Create();
}
}

public void Create()
{
//GS - Save object to db and insert returned Id
}

public void Read(int targetId)
{
//GS - Read row from db and fill in attributes
}

public void Update()
{
//GS - Save changes to db don’t forget optimistic
//locking check
}

public void Delete()
{
//GS - Delete row from db where PK = Id
}
}

///
/// GS - Impliment a business object that extends ActiveRecord
///

public class BusinessObject : ActiveRecord
{
//GS - Business specific code here
}

///
/// GS - Implement a class to test our implementation
///

public class Tester
{
public void Test()
{
BusinessObject bo = new BusinessObject();

//GS - Set BO specific attributes here

bo.Save(); //GS - Will call Create()

//GS - Change specific BO attributes here

bo.Save(); //GS - Will call Update()
bo.Read(bo.Id);
bo.Delete();
}
}
}

No comments:

About Me

Bangalore, Karnataka, India