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

我是3层体系结构的新手,下面是我的DAL代码

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

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

    }

我的用户界面

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

这是3层代码的正确方法吗?我的意思是如何从DAL调用方法到BAL和UI?如果不是建议我一些好方法。谢谢。


通常我会做以下事情:

  • 定义一个业务层(BL,你称之为BAL)。 这包含您的业务实体的定义。 它还定义了接口来检索/保存/删除您使用的任何模式(存储库,上下文等)的数据。
  • 定义数据访问层(DAL)。 这包含了检索/保存/删除接口的实际实现。
  • 定义一个UI层。 这包含UI元素(表单,控件,模型,控制器等),它们可以使用BL来加载数据。
  • 参考资料如下:

  • BL不知道DAL或UI。
  • DAL知道BL。 DAL不知道用户界面。
  • 用户界面知道BL。 UI不知道DAL。
  • 对你来说,最大的问题可能是,BL在不知道DAL时如何检索/保存/删除数据,因此无法在DAL中创建类的实例。 那么,这是一个小小的依赖注入派上用场的地方。 所有你必须连接的是DAL-class到BL接口的注入。

    希望这是有道理的。 我将它用作我的标准3层实现,它的工作原理完全没有问题。 具体来说,我使用实体框架和POCO实体,而我使用的DI是一个自定义的实体框架,但其中的任何一个都可以。

    UPDATE

    BL不知道DAL。

  • BL定义了一个接口(让它称为IRepository),它可以用它来完成它需要做的事情。
  • DAL定义了一个实现接口IRepository的类(Repository)。 所以存储库的实际实现在DAL中。
  • BL显然不能直接创建存储库的实例。 这是依赖注入的地方,这允许开发人员创建一个通常不能完成的类的实例。 这个简单的粗糙版本是使用反射。
  • 我希望这更有意义。


    你可以为以下三层架构的示例代码: -

    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
    }
    

    用户界面: -

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

    希望这将有助于充分。


    它可以帮助你看到一些实际的代码。 我建议你下载NetTiers,根据你的数据库模式运行它,并查看输出代码的实现细节。

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

    上一篇: Use of BAL in 3 tier architecture?How to call methods from DAL to BAL

    下一篇: Good IOC Frameworks to use with asp.net mvc?