具有完全相同名称(签名等)的 BAL 和 DAL 方法的 n 层 c# 应用程序

n-tier c# applicaiton with BAL and DAL methods with exact same names ( signatures etc.. )

我在一个项目中没有看到以前的开发人员如何做出决定的要点。

  1. DAL 和 BAL 中的方法名称完全相同
  2. 静态无处不在
  3. 我应该如何使用新方法来遵循最佳实践?

现有代码示例:

调用应用程序(可以是控制台应用程序或网络应用程序等。不可知)

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 来强制执行要求(例如最大长度、允许的字符、校验和要求等)