реализовать N-Tier Entity Framework 4.0 с DTO - PullRequest
0 голосов
/ 10 июня 2010

В настоящее время я создаю веб-систему и пытаюсь реализовать N-Tier Entity Framework 4.0 с DTO в архитектуре SOA. У меня возникают проблемы с пониманием того, как мне следует реализовать уровень доступа к данным (DAL), уровень бизнес-логики (BLL) и уровень представления.

Предположим, что у меня есть сущность «useraccount»:

Id

1007 * FirstName *

LastName

AuditFields_InsertDate

AuditFields_UpdateDate

В DAL я создал класс «UserAccountsData.cs» следующим образом:

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();
    }
  }
}

И в BLL я создал класс «UserAccountEO.cs» следующим образом:

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;
    }
  }
}

И в PL я создал веб-страницу следующим образом:

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();
    }

  }
}

Является ли вышеуказанный способ правильным способом реализации шаблона DTO в n-уровневой архитектуре с использованием EF4 ???

Буду признателен за вашу помощь Спасибо.

Ответы [ 2 ]

2 голосов
/ 14 июля 2010

В Интернете есть отличная публикация, опубликованная Дэниелом Симмонсом, в которой показано, как реализовать приложение N-Tier

с Entity Framework с использованием Self-Tracking Entity и DTO. Думаю, это поможет вам

http://msdn.microsoft.com/en-us/magazine/3fc94394-227a-4781-a4aa-6ca95ff0107a, и посмотрите также

эти сообщения http://msdn.microsoft.com/en-us/magazine/acc3017a-9ec8-4c0e-81e3-db9099e7e4e4

и http://msdn.microsoft.com/en-us/magazine/acc3017a-9ec8-4c0e-81e3-db9099e7e4e4

Удачи!

1 голос
/ 24 января 2013

DTO должны иметь только свойства, а не методы, такие как UserAccountEO.Вы должны отделить код DTO от логики, которая отображает сущности в DTO.

Все остальное кажется правильным.

BTW: EntitiesToDTOs - это инструмент, который генерирует DTO из вашегоФайл EDMX Entity Framework, он может помочь вам сэкономить время и усилия на разработку.

...