我有一个名为DAL_Base的基类,用于完成大部分 SQL 提升的大型项目。
DAL_Base具有SELECT
语句、GetRecords()
方法和virtual FillData(IDataRecord)
.
public class DAL_Base<T> where T : IDisposable, new() {
private string connStr;
public DAL_Base() {
connStr = ConfigurationManager.ConnectionStrings["CompanyDatabaseConnStr"].ConnectionString;
}
internal string SP_GET { get; set; }
internal SqlConnection m_openConn {
get {
var obj = new SqlConnection(connStr);
obj.Open();
return obj;
}
}
internal virtual T FillDataRecord(IDataRecord record) {
return new T();
}
internal TList<T> Get() {
if (String.IsNullOrEmpty(SP_GET)) {
throw new NotSupportedException(string.Format("Get Procedure does not exist for {0}.", typeof(T)));
}
var list = new TList<T>();
using (var cmd = new SqlCommand(SP_GET, m_openConn)) {
cmd.CommandType = cmd.GetCommandTextType();
using (var r = cmd.ExecuteReader()) {
while (r.Read()) {
list.Add(FillDataRecord(r));
}
}
cmd.Connection.Close();
}
return list;
}
}
还有很多,但这对于一个例子就足够了。
TList只是一个List<T>
类:
internal class TList<T> : List<T> {
public TList() { }
}
当我的一个类继承自它时,我希望它能够覆盖基类的FillDataRecord(IDataRecord)
.
例如,EmployeeDB ** 继承 **DAL_BASE。
当我调用时EmployeeDB.GetEmployeeList()
,它使用DAL_BASE来提取记录:
public class EmployeeDB : DAL_Base<Employee> {
private static EmployeeDB one;
static EmployeeDB() {
one = new EmployeeDB() {
SP_GET = "getEmployeeList",
};
}
private EmployeeDB() { }
internal override Employee FillDataRecord(IDataRecord record) {
var item = base.FillDataRecord(record);
item.Emp_Login = record.Str("Emp_Login");
item.Emp_Name = record.Str("Emp_Name");
item.Emp_Email = record.Str("Emp_Email");
item.Emp_Phone = record.Str("Emp_Phone");
item.Emp_Role = record.Str("Emp_Role");
return item;
}
public static EmployeeList GetEmployeeList() {
var list = new EmployeeList();
list.AddRange(one.Get());
return list;
}
}
在上面的代码中,当GetEmployeeList()
调用DAL_Base方法时Get()
,只调用了DAL_Base::FillDataRecord(IDataRecord)。
我真的需要调用EmployeeDB::FillDataRecord(IDataRecord),但我不能使DAL_Base::FillDataRecord(IDataRecord)抽象。
解决方法是什么?
我现在所知道的就是创建一个EventHandler
,这是我刚刚想到的,所以我将朝着这个方向努力。
如果有人知道更好的路线,请加入!