如何在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);**
}
}
这是我的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;
}
答案 0 :(得分:2)
Scott Ambler:构建有效的对象应用程序。
没有进一步的评论 - 整个DAL几乎是一个很好的演示如何不这样做。 DAL应该根本没有(!)对BLL的引用。没有。 DAL代码区域根本不应该是对BLL层的任何引用。
在你的情况下,我强烈建议你看一下:
答案 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);