如何从DAL调用基本抽象或接口到BLL?

时间:2010-03-23 13:19:24

标签: c# .net asp.net visual-studio

如何在BLL中访问抽象类?我不应该在BLL中看到GenAccessor它必须是私有类GenAccessor。我应该通过_AccessorForSQL访问Save方法。 OK?

MY BLL cs:


 public class AccessorForSQL: GenoTip.DAL._AccessorForSQL
    {
        public bool Save(string Name, string SurName, string Adress)
        {

            ListDictionary ld = new ListDictionary();
            ld.Add("@Name", Name);
            ld.Add("@SurName", SurName);
            ld.Add("@Adress", Adress);
            return **base.Save("sp_InsertCustomers", ld, CommandType.StoredProcedure);**
        }
    }

我无法访问base.Save .... ????????

这是我的DAL图层:

namespace GenoTip.DAL
{
    public abstract class _AccessorForSQL
    {
        public abstract bool Save(string sp, ListDictionary ld, CommandType cmdType);
        public abstract bool Update();
        public abstract bool Delete();
        public abstract DataSet Select();
    }

   private class GenAccessor : _AccessorForSQL
    {
        DataSet ds;
        DataTable dt;
        public override bool Save(string sp, ListDictionary ld, CommandType cmdType)
        {
            SqlConnection con = null;
            SqlCommand cmd = null;
            SqlDataReader dr = null;
            try
            {
                con = GetConnection();
                cmd = new SqlCommand(sp, con);
                con.Open();
                cmd.CommandType = cmdType;
                foreach (string ky in ld.Keys)
                {
                    cmd.Parameters.AddWithValue(ky, ld[ky]);
                }
                dr = cmd.ExecuteReader();
                ds = new DataSet();
                dt = new DataTable();
                ds.Tables.Add(dt);
                ds.Load(dr, LoadOption.OverwriteChanges, dt);

            }
            catch (Exception exp)
            {

                HttpContext.Current.Trace.Warn("Error in GetCustomerByID()", exp.Message, exp);
            }
            finally
            {
                if (dr != null) dr.Close();
                if (con != null) con.Close();

            }
            return (ds.Tables[0].Rows.Count > 0) ? true : false;

        }
        public override bool Update()
        {
            return true;
        }
        public override bool Delete()
        {
            return true;
        }
        public override DataSet Select()
        {
            DataSet dst = new DataSet();
            return dst;
        }


        private static SqlConnection GetConnection()
        {
            string connStr = WebConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
            SqlConnection conn = new SqlConnection(connStr);
            return conn;
        }

5 个答案:

答案 0 :(得分:2)

Scott Ambler:构建有效的对象应用程序。

没有进一步的评论 - 整个DAL几乎是一个很好的演示如何不这样做。 DAL应该根本没有(!)对BLL的引用。没有。 DAL代码区域根本不应该是对BLL层的任何引用。

在你的情况下,我强烈建议你看一下:

  • BLToolkit
  • Nhibernate的

答案 1 :(得分:0)

如果要访问save方法,只需创建DAL实例并调用.Save方法,如下所示:

using(GenAccessor g = new GenAccessor)
 {
   g.save(sproc, param2, param3);
 }

答案 2 :(得分:0)

您的AccessorForSQL课程也必须标记为abstract,因为您没有为_AccessorForSQL中的抽象方法提供任何实施。

澄清:此处不能使用base关键字,因为它表示您要调用在基类中找到的特定实现,因为该方法显然不存在是抽象的。也就是说,这并不意味着你不能调用该方法,你只需要删除base关键字。同样,由于您没有从子类中的基类实现任何抽象方法,因此必须将子类标记为抽象。以下应该有效:

public abstract class AccessorForSQL: GenoTip.DAL._AccessorForSQL
{
    public bool Save(string Name, string SurName, string Adress)
    {

        ListDictionary ld = new ListDictionary();
        ld.Add("@Name", Name);
        ld.Add("@SurName", SurName);
        ld.Add("@Adress", Adress);
        return Save("sp_InsertCustomers", ld, CommandType.StoredProcedure);
    }
}

答案 3 :(得分:0)

您应该考虑在_AccessorForSQL类中使用默认实现。然后你根本不需要GenAccessor。

顺便说一下,你不应该在你的DAL中使用任何与网络相关的东西。应该考虑HttpContext和WebConfigurationManager,以便在其他上下文中使用DAL层,例如WinForms。

namespace GenoTip.DAL
{
    public interface IAccessorForSQL
    {
        bool Delete();
        bool Save(string sp, ListDictionary ld, CommandType cmdType);
        DataSet Select();
        bool Update();
    }

    public class _AccessorForSQL : IAccessorForSQL
    {
        private DataSet ds;
        private DataTable dt;


        public virtual bool Save(string sp, ListDictionary ld, CommandType cmdType)
        {
            SqlConnection con = null;
            SqlCommand cmd = null;
            SqlDataReader dr = null;
            try
            {
                con = GetConnection();
                cmd = new SqlCommand(sp, con);
                con.Open();
                cmd.CommandType = cmdType;
                foreach (string ky in ld.Keys)
                {
                    cmd.Parameters.AddWithValue(ky, ld[ky]);
                }
                dr = cmd.ExecuteReader();
                ds = new DataSet();
                dt = new DataTable();
                ds.Tables.Add(dt);
                ds.Load(dr, LoadOption.OverwriteChanges, dt);
            }
            catch (Exception exp)
            {
                HttpContext.Current.Trace.Warn("Error in GetCustomerByID()", exp.Message, exp);
            }
            finally
            {
                if (dr != null)
                {
                    dr.Close();
                }
                if (con != null)
                {
                    con.Close();
                }
            }
            return (ds.Tables[0].Rows.Count > 0) ? true : false;
        }

        public abstract bool Update();
        public abstract bool Delete();
        public abstract DataSet Select();

        private static SqlConnection GetConnection()
        {
            string connStr = WebConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
            var conn = new SqlConnection("");
            return conn;
        }
    }
}

答案 4 :(得分:-1)

你不能调用抽象方法,因为它没有实现!

也许你想要一个虚拟方法?

顺便说一句:

return (ds.Tables[0].Rows.Count > 0) ? true : false;

与此相同:

return (ds.Tables[0].Rows.Count > 0);