implement N-Tier Entity Framework 4.0 with DTOs
- by kathy
Hi,
I'm currently building a web based system and trying to implement N-Tier Entity Framework 4.0 with DTOs in a SOA Architecture. I am having a problem understanding how I should implement the Data Access Layer (DAL) , the Business Logic Layer (BLL) and the Presentation Layer.
Let’s suppose that I have a “useraccount” entity  has the following :
Id
FirstName
LastName
AuditFields_InsertDate
AuditFields_UpdateDate
In the  DAL  I created a class “UserAccountsData.cs” as the following :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace OrderSystemDAL
{
  public static class UserAccountsData
  {
    public static int Insert(string firstName, string lastName, DateTime insertDate)
    {
      using (OrderSystemEntities db = new OrderSystemEntities())
      {
        return Insert(db, firstName, lastName, insertDate);
      }
    }
    public static int Insert(OrderSystemEntities db, string firstName,
                 string lastName, DateTime insertDate)
    {
      return db.UserAccounts_Insert(firstName, lastName, insertDate, insertDate).ElementAt(0).Value;
    }
    public static void Update(int id, string firstName, string lastName,
                 DateTime updateDate)
    {
      using (OrderSystemEntities db = new OrderSystemEntities())
      {
        Update(db, id, firstName, lastName, updateDate);
      }
    }
    public static void Update(OrderSystemEntities db, int id, string firstName,
                 string lastName, DateTime updateDate)
    {
      db.UserAccounts_Update(id, firstName, lastName, updateDate);
    }
    public static void Delete(int id)
    {
      using (OrderSystemEntities db = new OrderSystemEntities())
      {
        Delete(db, id);
      }
    }
    public static void Delete(OrderSystemEntities db, int id)
    {
      db.UserAccounts_Delete(id);
    }
    public static UserAccount SelectById(int id)
    {
      using (OrderSystemEntities db = new OrderSystemEntities())
      {
        return SelectById(db, id);
      }
    }
    public static UserAccount SelectById(OrderSystemEntities db, int id)
    {
      return db.UserAccounts_SelectById(id).ElementAtOrDefault(0);
    }
    public static List<UserAccount> SelectAll()
    {
      using (OrderSystemEntities db = new OrderSystemEntities())
      {
        return SelectAll(db);
      }
    }
    public static List<UserAccount> SelectAll(OrderSystemEntities db)
    {
      return db.UserAccounts_SelectAll().ToList();
    }
  }
}
And in the  BLL I created a class “UserAccountEO.cs” as the following :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using OrderSystemDAL;
namespace OrderSystemBLL
{
  public class UserAccountEO
  {
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public DateTime InsertDate { get; set; }
    public DateTime UpdateDate { get; set; }
    public string FullName
    {
      get
      {
        return LastName + ", " + FirstName;
      }
    }
    public bool Save(ref ArrayList validationErrors)
    {
      ValidateSave(ref validationErrors);
      if (validationErrors.Count == 0)
      {
        if (Id == 0)
        {
          Id = UserAccountsData.Insert(FirstName, LastName, DateTime.Now);
        }
        else
        {
          UserAccountsData.Update(Id, FirstName, LastName, DateTime.Now);
        }
        return true;
      }
      else
      {
        return false;
      }
    }
    private void ValidateSave(ref ArrayList validationErrors)
    {
      if (FirstName.Trim() == "")
      {
        validationErrors.Add("The First Name is required.");
      }
      if (LastName.Trim() == "")
      {
        validationErrors.Add("The Last Name is required.");
      }
    }
    public void Delete(ref ArrayList validationErrors)
    {
      ValidateDelete(ref validationErrors);
      if (validationErrors.Count == 0)
      {
        UserAccountsData.Delete(Id);
      }
    }
    private void ValidateDelete(ref ArrayList validationErrors)
    {
      //Check for referential integrity.
    }
    public bool Select(int id)
    {
      UserAccount userAccount = UserAccountsData.SelectById(id);
      if (userAccount != null)
      {
        MapData(userAccount);
        return true;
      }
      else
      {
        return false;
      }
    }
    internal void MapData(UserAccount userAccount)
    {
      Id = userAccount.Id;
      FirstName = userAccount.FristName;
      LastName = userAccount.LastName;
      InsertDate = userAccount.AuditFields_InsertDate;
      UpdateDate = userAccount.AuditFields_UpdateDate;
    }
    public static List<UserAccountEO> SelectAll()
    {
      List<UserAccountEO> userAccounts = new List<UserAccountEO>();
      List<UserAccount> userAccountDTOs = UserAccountsData.SelectAll();
      foreach (UserAccount userAccountDTO in userAccountDTOs)
      {
        UserAccountEO userAccountEO = new UserAccountEO();
        userAccountEO.MapData(userAccountDTO);
        userAccounts.Add(userAccountEO);
      }
      return userAccounts;
    }
  }
}
And in the PL I created a webpage as the following :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using OrderSystemBLL;
using System.Collections;
namespace OrderSystemUI
{
  public partial class Users : System.Web.UI.Page
  {
    protected void Page_Load(object sender, EventArgs e)
    {
      if (!IsPostBack)
      {
        LoadUserDropDownList();
      }
    }
    private void LoadUserDropDownList()
    {
      ddlUsers.DataSource = UserAccountEO.SelectAll();
      ddlUsers.DataTextField = "FullName";
      ddlUsers.DataValueField = "Id";
      ddlUsers.DataBind();
    }
  }
}
Is the above way the right way to Implement the DTOs pattern in n-tier Architecture using EF4 ???
I would appreciate your help
Thanks.