具有完全相同名称(签名等)的 BAL 和 DAL 方法的 n 层 c# 应用程序
n-tier c# applicaiton with BAL and DAL methods with exact same names ( signatures etc.. )
我在一个项目中没有看到以前的开发人员如何做出决定的要点。
- DAL 和 BAL 中的方法名称完全相同
- 静态无处不在
- 我应该如何使用新方法来遵循最佳实践?
现有代码示例:
调用应用程序(可以是控制台应用程序或网络应用程序等。不可知)
DataSet DS = CreditMgr.GetCreditRqstInfo(ddlGEO.Text);
BAL
public class CreditMgr
{
public static DataSet GetCreditRqstInfo(String GeoID)
{
try
{
DataSet DS = new DataSet();
DS = CreditIntfDB.GetCreditRqstInfo(GeoID);
return DS;
}
catch (Exception ex)
{
throw ex;
}
}
}
DAL
public class CreditIntfDB
{
public static DataSet GetCreditRqstInfo(String GeoID)
{
try
{
Database DB = new SqlDatabase(Common.ConnectionString);
String SQLCommand = Common.SPGetRqstInfo;
DbCommand DBCommand = DB.GetStoredProcCommand(SQLCommand);
DBCommand.CommandTimeout = Common.CommandTimeOut;
DB.AddInParameter(DBCommand, "@a_geo_id", DbType.String, GeoID);
DataSet DS = new DataSet();
DB.LoadDataSet(DBCommand, DS, new String[] { "CreditRqstInfo" });
return DS;
}
catch (Exception ex)
{
throw ex;
}
}
}
是的,关键是要有层次分离,但是当使用相同的方法名称和静态方法时,每个方法只是做同样的事情,传入字符串并返回 DataSet 对我有 "code smell"
关于更好的方法的建议?
根据标准的面向对象编程 (OOP) 设计,您的 BAL classes 应该代表 "things" 具有一些现实世界的商业意义。与其使用具有静态方法来获取 CreditRqst 的 CreditMgr,不如创建一个 class CreditRequest 来存储自己的数据(例如 DataSet),并且最好以某种业务友好的方式(例如 CreditLine 列表或帐户列表)。
从那里,您可以在 CreditRequest 中实现 Get 方法,也可以将 CreditMgr 变成服务对象(例如 "CreditBureau"、"Bank"、"AccountsDesk" 等.),它有一个接受字符串 GeoID 和 returns CreditRequest.
的方法
此外,使用字符串作为键(例如在 GeoID 中)也很臭。你能想出一些更强类型的东西吗?您可以创建一个 class GeoID 来强制执行要求(例如最大长度、允许的字符、校验和要求等)
我在一个项目中没有看到以前的开发人员如何做出决定的要点。
- DAL 和 BAL 中的方法名称完全相同
- 静态无处不在
- 我应该如何使用新方法来遵循最佳实践?
现有代码示例:
调用应用程序(可以是控制台应用程序或网络应用程序等。不可知)
DataSet DS = CreditMgr.GetCreditRqstInfo(ddlGEO.Text);
BAL
public class CreditMgr
{
public static DataSet GetCreditRqstInfo(String GeoID)
{
try
{
DataSet DS = new DataSet();
DS = CreditIntfDB.GetCreditRqstInfo(GeoID);
return DS;
}
catch (Exception ex)
{
throw ex;
}
}
}
DAL
public class CreditIntfDB
{
public static DataSet GetCreditRqstInfo(String GeoID)
{
try
{
Database DB = new SqlDatabase(Common.ConnectionString);
String SQLCommand = Common.SPGetRqstInfo;
DbCommand DBCommand = DB.GetStoredProcCommand(SQLCommand);
DBCommand.CommandTimeout = Common.CommandTimeOut;
DB.AddInParameter(DBCommand, "@a_geo_id", DbType.String, GeoID);
DataSet DS = new DataSet();
DB.LoadDataSet(DBCommand, DS, new String[] { "CreditRqstInfo" });
return DS;
}
catch (Exception ex)
{
throw ex;
}
}
}
是的,关键是要有层次分离,但是当使用相同的方法名称和静态方法时,每个方法只是做同样的事情,传入字符串并返回 DataSet 对我有 "code smell"
关于更好的方法的建议?
根据标准的面向对象编程 (OOP) 设计,您的 BAL classes 应该代表 "things" 具有一些现实世界的商业意义。与其使用具有静态方法来获取 CreditRqst 的 CreditMgr,不如创建一个 class CreditRequest 来存储自己的数据(例如 DataSet),并且最好以某种业务友好的方式(例如 CreditLine 列表或帐户列表)。
从那里,您可以在 CreditRequest 中实现 Get 方法,也可以将 CreditMgr 变成服务对象(例如 "CreditBureau"、"Bank"、"AccountsDesk" 等.),它有一个接受字符串 GeoID 和 returns CreditRequest.
的方法此外,使用字符串作为键(例如在 GeoID 中)也很臭。你能想出一些更强类型的东西吗?您可以创建一个 class GeoID 来强制执行要求(例如最大长度、允许的字符、校验和要求等)