Use of BAL in 3 tier architecture?How to call methods from DAL to BAL

I am a newbie to 3 tier architecture and below is my DAL code

public static int Insert(string firstname, string lastname, DateTime dob, string gender,string email, string password)
    {
        // bool flag = false;
        SqlParameter pid;
        SqlParameter result;

        SqlConnection con = Generic.DBConnection.OpenConnection();

        try
        {

            SqlCommand cmd1 = new SqlCommand("Insertreg", con);
            cmd1.CommandType = CommandType.StoredProcedure;
            cmd1.Parameters.AddWithValue("@FirstName", firstname);
            cmd1.Parameters.AddWithValue("@LastName", lastname);
            cmd1.Parameters.AddWithValue("@Dob", dob);
            cmd1.Parameters.AddWithValue("@Gender", gender);
           cmd1.Parameters.AddWithValue("@EmailId", email);
            cmd1.Parameters.AddWithValue("@Password", password);
            result = cmd1.Parameters.Add("@result", System.Data.SqlDbType.Int);
            result.Direction = System.Data.ParameterDirection.Output;
            pid = cmd1.Parameters.Add("@id", System.Data.SqlDbType.Int);
            pid.Direction = System.Data.ParameterDirection.Output;
            return cmd1.ExecuteNonQuery();


            con.Close();

        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

this in BAL

 public int insert(string firstname,string lastname,DateTime dob,string gender,string email,string password)
    {
      ProfileMasterDAL dal=new ProfileMasterDAL();
      try
      {
          return ProfileMasterDAL.Insert(firstname, lastname, dob, gender,email, password);
      }
      catch (Exception ex)
      {

          throw ex;
      }
        finally
      {
          dal = null;
      }

    }

I my UI

  ProfileMasterBLL pmBLL = new ProfileMasterBLL();
 pmBLL.insert(firstname, lastname, dob, gender, mobile, country, state, email, password);

Is this the correct way to code in 3 tier??I mean how to call methods from DAL to BAL and into UI?If not suggest me some good way.Thanks.


Normally I do the following:

  • Define a Business Layer (BL, you call it BAL). This contains the definitions of you business entities. It also defines interfaces to retrieve/save/delete data for whatever patterns you use (repository, context, etc).
  • Define a Data Access Layer (DAL). This contains the actual implementation for the retrieve/save/delete interfaces.
  • Define a UI layer. This contains UI elements (forms, controls, models, controllers, etc), which can use the BL to load data.
  • The references are the following:

  • The BL doesn't know the DAL or the UI.
  • The DAL knows the BL. The DAL does not know the UI.
  • THe UI knows the BL. The UI does not know the DAL.
  • The big question for you probably is, how does the BL retrieve/save/delete data when it doesn't know the DAL, and therefore cannot create an instance of a class in the DAL. Well, this is where a little Dependency Injection comes in handy. All you have to wire up is the injection of the DAL-class to the BL-interface.

    Hope this makes sense. I use it as my standard 3-tier implementation, and it works absolutely without problems. Specifically, I use Entity Framework with POCO for entities, and the DI I use is a custom one, but any of the ones out there will do.

    UPDATE

    The BL does not know the DAL.

  • The BL defines an interface (lets call it IRepository) which it can use to do what it needs to do.
  • The DAL defines a class (Repository) which implements the interface IRepository. So the actual implementation of the repository is in the DAL.
  • Obviously the BL cannot create an instance of the repository directly. This is where dependency injection comes in, this allows the developer to create an instance of a class where it normally cannot be done. A simple crude version of this, is to use reflection.
  • I hope this makes more sense.


    You can you the following sample code for 3 tier architecture :-

    CLASS - BAL.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Collections;
    
    public class BAL
    {
        DAL objDAL;
        public BAL()
        {
    
        }
    
        public string _Name;
        public string Name
        {
            get { return _Name; }
            set { _Name = value; }
        }
    
        public int insert()
        {
            objDAL = new DAL();
            int val = 0;
            try
            {
                Hashtable objHash = new Hashtable();
                objHash.Add("@Name", Convert.ToString(_Name));
                val = objDAL.Insert("Your SP Name", objHash);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                objDAL = null;
            }
            return val;
        }
    }
    

    CLASS - DAL.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Data;
    using System.Data.SqlClient;
    using System.Collections;
    
    public class DAL : IDisposable
    {
        SqlConnection con;
    
        public DAL()
        {
            con = new SqlConnection("Connection String");
        }
    
        public int Insert(string CMD, Hashtable objHash)
        {
            int val = 0;
            try
            {
                SqlCommand cmd1 = new SqlCommand(CMD, con);
                cmd1.CommandType = CommandType.StoredProcedure;
                foreach (DictionaryEntry de in objHash)
                {
                    cmd1.Parameters.AddWithValue(Convert.ToString(de.Key), Convert.ToString(de.Value));
                }
                con.Open();
                val = cmd1.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                con.Close();
            }
            return val;
        }
    
        #region IDisposable Members
    
        public void Dispose()
        {
            throw new NotImplementedException();
        }
    
        #endregion
    }
    

    UI:-

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    public partial class _Default : System.Web.UI.Page
    {
    
        BAL objBAL;
    
        protected void Page_Load(object sender, EventArgs e)
        {
            Insert();
        }
    
        public void Insert()
        {
            int val = 0;
            objBAL = new BAL();
            objBAL.Name = "stackoverflow";
            try
            {
                val = objBAL.insert();
            }
            catch { }
            finally
            {
                objBAL = null;
            }
            if (val != 0)
            {
                //Insert sucessful
            }
            else
            {
                //Error in Insert.
            }
        }
    }
    

    Hope this will help full.


    It might help you to see some actual code. I suggest you download NetTiers, run it against your db schema and see the outputted code for the implementation details.

    链接地址: http://www.djcxy.com/p/82128.html

    上一篇: 依赖倒置。 对象创建

    下一篇: 在三层架构中使用BAL?如何从DAL调用方法到BAL