3階層アーキテクチャ

4810 ワード

なぜ3階層アーキテクチャを使用するのですか?
1.高凝集、低結合のための思想2.従来の階層の実装3を新しい実装で簡単に置き換えることができる.実際の開発では、開発者は構造全体のいずれかに注目しています.
3階層アーキテクチャの使用方法
3階層アーキテクチャの使用はプロジェクトの規模に関係し、一般的に大規模なプロジェクトで使用されます.実際のデータストレージがない場合は使用する必要はありません.DAL、BLL、UIはそれぞれ異なるプログラムセットに存在する.DAL層データ層.基本的なデータアクセスのみを提供します.データソースからデータをロードし、データソースにデータを書き込み、データソースからデータを削除します.他のデータベースにアクセスする機能も備えています.BLL層ビジネス層.業務ロジックの処理を担当し、UIからの操作命令を取得することで、業務ロジックの実行を決定し、データソースにアクセスする必要がある場合にDAL処理に直接渡す.処理が完了すると、UIに必要なデータが返されます.UIレイヤ表示レイヤ.ユーザー操作の表示と収集を担当します.ユーザーに特定の業務データを表示し、ユーザーの入力情報と操作を収集する.設計原則は主にユーザーを主とする.
3階層アーキテクチャの応用
Modelエンティティークラス
namespace Login.Model
{
public class Userinfo//          
{
    public int ID { get; set; }
    public string UserName { get; set; }
    public string PassWord { get; set; }
    public string Email { get; set; }
}
}

DAL層
namespace Login.DAL
{
    class Dbutil
{
    //              
    public static string Connstring = @"Server=DESKTOP-MNRLSKH;Database=login;User ID=sa;Password=123456";
}
}
using System.Data;
using System.Data.SqlClient;
namespace Login.DAL
{
public class UserDAO
{
    //       Login.Model,   Userinfo  SelectUser  
    public Login.Model.Userinfo SelectUser(string UserName,string passWord)
    {
        //        conn
        using (SqlConnection conn = new SqlConnection(Dbutil.Connstring))
        {
            //        ,     
            SqlCommand cmd = conn.CreateCommand();
            cmd.CommandText = "SELECT * FROM Users WHERE UserName=@UserName AND password=@Password";
            //               
            cmd.CommandType = CommandType.Text;
            //     ,       
            cmd.Parameters.Add(new SqlParameter("@UserName", UserName));
            cmd.Parameters.Add(new SqlParameter("@PassWord", passWord));
            //    
            conn.Open();
            SqlDataReader reader = cmd.ExecuteReader();//       
            Login.Model.Userinfo user = null;
            while (reader.Read())
            {
                if (user == null)//    ,      
                {
                    user = new Login.Model.Userinfo();
                }
                //         User
                user.ID = reader.GetInt32(0);//   int    
                user.UserName = reader.GetString(1);
                user.PassWord = reader.GetString(2);
                if (!reader.IsDBNull(3))//Email    
                {
                    user.Email = reader.GetString(3);
                }
            }
            return user;
        }
    }
}
}
using System.Data;
using System.Data.SqlClient;
namespace Login.DAL
{
public class ScoreDAO
{
    public void UpdateScore(string userName,int value)
    {
        //       
        using (SqlConnection conn=new SqlConnection(Dbutil.Connstring))
        {
            //        
            SqlCommand cmd = conn.CreateCommand();
            cmd.CommandText = "INSERT INTO Scores(UserName,Score) Values(@UserName,@Score)";//             
            //      
            cmd.Parameters.Add(new SqlParameter("@UserName", userName));
            cmd.Parameters.Add(new SqlParameter("@Score", value));
            conn.Open();
            cmd.ExecuteNonQuery();//  Sql      
        }
    }
}
}

BLL層
namespace LoginBLL
{
public class LoginServers 
{
    public Login.Model.Userinfo UserLogin(string userName,string passWord)
    {
        Login.DAL.UserDAO uDao = new Login.DAL.UserDAO();//   DAL UserDAO  uDao

        Login.Model.Userinfo user=uDao.SelectUser(userName, passWord);//  uDAO             Model  user  

        if (user != null)//  user      
        {
            Login.DAL.ScoreDAO sDao = new Login.DAL.ScoreDAO();//     sDao
            sDao.UpdateScore(userName, 10);//sDao    Score      
            return user;
        }
        else//           
        {
            throw new Exception("    ");//    
        }
    }
}
}

UI層
namespace LoginUI
{
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
    private void btnLogin_Click(object sender, EventArgs e)
    {
        string userName = txtusername.Text.Trim();//  userName           
        string password = txtpassword.Text;//  password          
        LoginBLL.LoginServers sgr = new LoginBLL.LoginServers ();//   Loginservices  
        Login.Model.Userinfo user = sgr.UserLogin(userName, password);//     user  ,  

        MessageBox.Show("    " + user.UserName);

    }
}
}

階層化アーキテクチャの欠点
1.中間層を介してデータを取得する必要があり、システムの動作性能を低下させる.2.カスケード化された修正が発生します.この修正は、特に上から下への方向に反映されます.表示レイヤに機能を追加し、階層構造に適合するように設計する必要がある場合は、対応するビジネスロジックレイヤとデータアクセスレイヤにコードを追加する必要があります.