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

时间:2016-06-15 21:30:36

标签: c# data-access-layer n-tier-architecture business-logic-layer

我正处于一个项目中,我没有看到前任开发人员如何做出决定。

  1. DAL和BAL中的确切方法名称
  2. 静态无处不在
  3. 我应该如何使用新方法来遵循最佳做法?
  4. 现有代码示例:

    调用应用程序(可能是控制台应用程序或Web应用程序等......不可知)

    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 对我有“代码味道”

    有关更好方法的建议?

1 个答案:

答案 0 :(得分:0)

根据标准的面向对象编程(OOP)设计,您的BAL类应代表"事物"这有一些现实世界的商业意义。不是让CreditMgr有一个静态方法来获取CreditRqst,而是创建一个存储自己数据的类CreditRequest(例如DataSet),最好以一些商业友好的方式包装它(例如CreditLine列表或账户列表)

从那里,您可以在CreditRequest内部实现Get方法,也可以将CreditMgr转换为服务对象(例如" CreditBureau"," Bank",&#34 ; AccountsDesk"等),它有一个采用String GeoID并返回CreditRequest的方法。

此外,使用字符串作为键(例如在GeoID中)也很臭。你能想出一些更强烈打字的东西吗?您可以创建一个强制要求的类GeoID(例如最大长度,允许的字符数,校验和要求等)。