2010-06-10 10 views
0

Je suis actuellement en train de construire un système basé sur le Web et en essayant d'implémenter N-Tier Entity Framework 4.0 avec les DTO dans une architecture SOA. J'ai un problème pour comprendre comment je devrais implémenter le couche d'accès aux données (DAL), la couche logique d'entreprise (BLL) et la couche de présentation.implémenter N-Tier Entity Framework 4.0 avec DTO

Supposons que j'ai une entité « useraccount » a les éléments suivants:

Id

FirstName

LastName

AuditFields_InsertDate

AuditFields_UpdateDate

En le DAL j'ai créé une classe « UserAccountsData.cs » comme suit:

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

Et dans le BLL je créé une classe « UserAccountEO.cs » comme suit:

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

Et dans le PL J'ai créé une page Web comme suit:

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

    } 
} 

est la manière au-dessus du droit chemin pour mettre en œuvre le modèle DTO en architecture n-tier en utilisant EF4 ???

J'apprécierais votre aide Merci.

Répondre

2

il est grand poste sur le web publié par des thats Daniel simmons montrer comment mettre en œuvre l'application N-Tier

avec Entity Framework à l'aide d'un auto-Traking Entité et DTO, je pense que cela vous aidera

http://msdn.microsoft.com/en-us/magazine/3fc94394-227a-4781-a4aa-6ca95ff0107a, et visionnent aussi

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

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

Bonne chance!

1

Les DTO doivent avoir uniquement des propriétés, pas des méthodes comme UserAccountEO. Vous devez séparer le code DTO de la logique qui mappe les entités aux DTO.

Tout le reste semble correct.

BTW: EntitiesToDTOs est un outil qui génère des DTO à partir de votre fichier EDMX Entity Framework, il peut vous aider beaucoup à économiser du temps et des efforts de développement.