implement N-Tier Entity Framework 4.0 with DTOs

Posted by kathy on Stack Overflow See other posts from Stack Overflow or by kathy
Published on 2010-06-10T16:09:11Z Indexed on 2010/06/10 16:13 UTC
Read the original article Hit count: 454

Filed under:
|

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.

© Stack Overflow or respective owner

Related posts about entity-framework

Related posts about dto