6

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

    }

私のUI

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

これは3層でコーディングする正しい方法ですか??DALからBAL、そしてUIにメソッドを呼び出す方法を意味しますか?そうでない場合は、良い方法を提案してください。ありがとうございます。

4

4 に答える 4

6

通常、私は次のことを行います。

  1. ビジネスレイヤーを定義します(BL、BALと呼びます)。これには、ビジネスエンティティの定義が含まれています。また、使用するパターン(リポジトリ、コンテキストなど)のデータを取得/保存/削除するためのインターフェイスも定義します。
  2. データアクセス層(DAL)を定義します。これには、取得/保存/削除インターフェイスの実際の実装が含まれています。
  3. UIレイヤーを定義します。これには、BLを使用してデータをロードできるUI要素(フォーム、コントロール、モデル、コントローラーなど)が含まれています。

参照は次のとおりです。

  1. BLはDALまたはUIを認識していません。
  2. DALはBLを知っています。DALはUIを認識していません。
  3. UIはBLを知っています。UIはDALを認識していません。

おそらくあなたにとっての大きな問題は、BLがDALを知らないため、DALにクラスのインスタンスを作成できない場合に、どのようにデータを取得/保存/削除するかということです。さて、これは少しの依存性注入が役立つところです。配線する必要があるのは、BLインターフェイスへのDALクラスの注入だけです。

これが理にかなっていることを願っています。私はこれを標準の3層実装として使用しており、まったく問題なく動作します。具体的には、エンティティにPOCOを使用したEntity Frameworkを使用しており、使用するDIはカスタムのものですが、他のどのDIでも使用できます。

アップデート

BLはDALを知りません。

  • BLは、必要なことを実行するために使用できるインターフェース(IRepositoryと呼びます)を定義します。
  • DALは、インターフェイスIRepositoryを実装するクラス(リポジトリ)を定義します。したがって、リポジトリの実際の実装はDALにあります。
  • 明らかに、BLはリポジトリのインスタンスを直接作成することはできません。これが依存性注入の出番です。これにより、開発者は通常は実行できないクラスのインスタンスを作成できます。これの単純な大まかなバージョンは、リフレクションを使用することです。

これがもっと理にかなっていることを願っています。

于 2012-08-31T12:03:45.723 に答える
0

次の3層アーキテクチャのサンプルコードを使用できます:-

クラス-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;
    }
}

クラス-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.
        }
    }
}
于 2012-08-31T12:19:37.853 に答える
0

実際のコードを確認するのに役立つ場合があります。NetTiersをダウンロードし、dbスキーマに対して実行し、実装の詳細について出力されたコードを確認することをお勧めします。

于 2012-08-31T15:12:21.880 に答える
0
using System;
using System.Data;
using System.Configuration;
using System.Collections.Generic;
using System.Text;
using System.Data.Common;
using System.Data.SqlClient;
using System.Data.OleDb;
using System.Data.Odbc;
using System.IO;
using System.ComponentModel;

namespace dal
{

    /// <summary>
    /// Summary description for Data Access Layer
    /// </summary>
    public class DataAccess
    {
        public string strConnectionString;
        private DbConnection objConnection;
        private DbCommand objCommand;
        private DbProviderFactory objFactory = null;
        private bool boolHandleErrors=false;
        private string strLastError;
        private bool boolLogError=false;
        private string strLogFile;

        public DataAccess()
        {

            //strConnectionString = ;
            strConnectionString = objCommon.GetConnectionString;
            objFactory = OleDbFactory.Instance;
            objConnection = objFactory.CreateConnection();
            objCommand = objFactory.CreateCommand();
            objConnection.ConnectionString = strConnectionString;
            objCommand.Connection = objConnection;
        }

        public bool HandleErrors
        {
            get
            {
                return boolHandleErrors;
            }
            set
            {
                boolHandleErrors = value;
            }
        }

        public string LastError
        {
            get
            {
                return strLastError;
            }
        }

        public bool LogErrors
        {
            get
-            {
                return boolLogError;
            }
            set
            {
                boolLogError = value;
            }
        }

        public string LogFile
        {
            get
            {
                return strLogFile;
            }
            set
            {
                strLogFile = value;
            }
        }

        public int AddParameter(string name, object value)
        {
            DbParameter p = objFactory.CreateParameter();
            p.ParameterName = name;
            p.Value = value;
            return objCommand.Parameters.Add(p);
        }

        public int AddParameter(string name, object value, ParameterDirection direction)
        {
            DbParameter p = objFactory.CreateParameter();
            p.ParameterName = name;
            p.Value = value;
            p.Direction = direction;
            return objCommand.Parameters.Add(p);
        }

        public int AddParameter(string name, object value, DbType type)
        {
            DbParameter p = objFactory.CreateParameter();
            p.ParameterName = name;
            p.Value = value;
            p.DbType = type;
            return objCommand.Parameters.Add(p);
        }

        public int AddParameter(DbParameter parameter)
        {
            return objCommand.Parameters.Add(parameter);
        }

        public DbCommand Command
        {
            get
            {
                return objCommand;
            }
        }

        public void BeginTransaction()
        {
            try
            {
                if (objConnection.State == System.Data.ConnectionState.Closed)
                {
                    objConnection.Open();
                }
                objCommand.Transaction = objConnection.BeginTransaction();
            }
            catch (Exception Ex)
            {
                HandleExceptions(Ex);
            }
        }

        public void CommitTransaction()
        {
            objCommand.Transaction.Commit();
            objConnection.Close();
        }

        public void RollbackTransaction()
        {
            objCommand.Transaction.Rollback();
            objConnection.Close();
        }

        public int ExecuteNonQuery(string query)
        {
            return ExecuteNonQuery(query, CommandType.Text, ConnectionState.CloseOnExit);
        }

        public int ExecuteNonQuery(string query, CommandType commandtype)
        {
            return ExecuteNonQuery(query, commandtype, ConnectionState.CloseOnExit);
        }

        public int ExecuteNonQuery(string query, ConnectionState connectionstate)
        {
            return ExecuteNonQuery(query, CommandType.Text, connectionstate);
        }

        public int ExecuteNonQuery(string query, CommandType commandtype, ConnectionState connectionstate)
        {
            objCommand.CommandText = query;
            objCommand.CommandType = commandtype;
            int i = -1;
            try
            {
                if (objConnection.State == System.Data.ConnectionState.Closed)
                {
                    objConnection.Open();
                }
                i = objCommand.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                HandleExceptions(ex);
            }
            finally
            {
                objCommand.Parameters.Clear();
                if (connectionstate == ConnectionState.CloseOnExit)
                {
                    objConnection.Close();
                }
            }

            return i;
        }

        public object ExecuteScalar(string query)
        {
            return ExecuteScalar(query, CommandType.Text, ConnectionState.CloseOnExit);
        }

        public object ExecuteScalar(string query, CommandType commandtype)
        {
            return ExecuteScalar(query, commandtype, ConnectionState.CloseOnExit);
        }

        public object ExecuteScalar(string query, ConnectionState connectionstate)
        {
            return ExecuteScalar(query, CommandType.Text, connectionstate);
        }

        public object ExecuteScalar(string query, CommandType commandtype, ConnectionState connectionstate)
        {
            objCommand.CommandText = query;
            objCommand.CommandType = commandtype;
            object o = null;
            try
            {
                if (objConnection.State == System.Data.ConnectionState.Closed)
                {
                    objConnection.Open();
                }
                o = objCommand.ExecuteScalar();
            }
            catch (Exception ex)
            {
                HandleExceptions(ex);
            }
            finally
            {
                objCommand.Parameters.Clear();
                if (connectionstate == ConnectionState.CloseOnExit)
                {
                    objConnection.Close();
                }
            }

            return o;
        }

        public DbDataReader ExecuteReader(string query)
        {
            return ExecuteReader(query, CommandType.Text, ConnectionState.CloseOnExit);
        }

        public DbDataReader ExecuteReader(string query, CommandType commandtype)
        {
            return ExecuteReader(query, commandtype, ConnectionState.CloseOnExit);
        }

        public DbDataReader ExecuteReader(string query, ConnectionState connectionstate)
        {
            return ExecuteReader(query, CommandType.Text, connectionstate);
        }

        public DbDataReader ExecuteReader(string query, CommandType commandtype, ConnectionState connectionstate)
        {
            objCommand.CommandText = query;
            objCommand.CommandType = commandtype;
            DbDataReader reader = null;
            try
            {
                if (objConnection.State == System.Data.ConnectionState.Closed)
                {
                    objConnection.Open();
                }
                if (connectionstate == ConnectionState.CloseOnExit)
                {
                    reader = objCommand.ExecuteReader(CommandBehavior.CloseConnection);
                }
                else
                {
                    reader = objCommand.ExecuteReader();
                }

            }
            catch (Exception ex)
            {
                HandleExceptions(ex);
            }
            finally
            {
                objCommand.Parameters.Clear();
            }

            return reader;
        }

        public DataSet ExecuteDataSet(string query)
        {
            return ExecuteDataSet(query, CommandType.Text, ConnectionState.CloseOnExit);
        }

        public DataSet ExecuteDataSet(string query, CommandType commandtype)
        {
            return ExecuteDataSet(query, commandtype, ConnectionState.CloseOnExit);
        }

        public DataSet ExecuteDataSet(string query, ConnectionState connectionstate)
        {
            return ExecuteDataSet(query, CommandType.Text, connectionstate);
        }

        public DataSet ExecuteDataSet(string query, CommandType commandtype, ConnectionState connectionstate)
        {
            DbDataAdapter adapter = objFactory.CreateDataAdapter();
            objCommand.CommandText = query;
            objCommand.CommandType = commandtype;
            adapter.SelectCommand = objCommand;
            DataSet ds = new DataSet();

            try
            {
                adapter.Fill(ds);
            }
            catch (Exception ex)
            {
                HandleExceptions(ex);
            }
            finally
            {
                objCommand.Parameters.Clear();
                if (connectionstate == ConnectionState.CloseOnExit)
                {
                    if (objConnection.State == System.Data.ConnectionState.Open)
                    {
                        objConnection.Close();
                    }
                }
            }
            return ds;
        }

        private void HandleExceptions(Exception ex)
        {

            throw ex;

        }

        private void WriteToLog(string msg)
        {
            StreamWriter writer = File.AppendText(LogFile);
            writer.WriteLine(DateTime.Now.ToString() + " - " + msg);
            writer.Close();
        }

        public void Dispose()
        {
            objConnection.Close();
            objConnection.Dispose();
            objCommand.Dispose();
        }



        public enum Providers
        {
            SqlServer, OleDb, Oracle, ODBC, ConfigDefined
        }

        public enum ConnectionState
        {
            KeepOpen, CloseOnExit
        }

        public interface ILoadFromDataRow
        {
            bool LoadFromDataRow(DataRow row);
        }


    }

}
于 2017-06-04T10:15:30.707 に答える