将2层架构转换为3层架构

时间:2018-10-02 06:09:47

标签: c# architecture

是的,这已经是一个问题了,可能很接近。但是我想要一个准确的答案。

我已经使用C#创建了一个简单的系统,我使用了2层体系结构,现在我想转换为3层体系结构,我阅读了很多文档,博客和关于StackOverflow的问题。 我想知道我的转换是否正确,否则请告诉我。

任何想法都会有很大帮助。

这是我在2层体系结构中的代码:

 dtpfromdate.MaxDate = DateTime.Today;
 dtptodate.MaxDate = DateTime.Today;
 dtpfromdate.Value = DateTime.Today;
 dtptodate.Value = DateTime.Today;
 this.Text = FormName;     

 Db = new DBLayer.DBLayer();
 cmbRD.DataSource = Db.getRSetSQL("exec IMC_DCNE..usp_Get_Shift_Timing", DBLayer.DBLayer.SqlType.SqlQuery);
 cmbRD.DisplayMember = "Shift_Complete_Details";
 cmbRD.ValueMember = "Shift_Name";

这是我将其转换为3层体系结构时的代码:

 dtpfromdate.MaxDate = DateTime.Today;
 dtptodate.MaxDate = DateTime.Today;
 dtpfromdate.Value = DateTime.Today;
 dtptodate.Value = DateTime.Today;
 this.Text = FormName;

 Generate_Report_BL obj_Generate_Report = new Generate_Report_BL();
 Shift_Timing shift = new Shift_Timing();
 List<Shift_Timing> ShiftList = obj_Generate_Report.Get_Shift_Timing("Shift_Name", "Shift_Complete_Details");
 cmbRD.DisplayMember = shift.Shift_Name;
 cmbRD.ValueMember = shift.Shift_Complete_Details;

这是我的业务层:

public class Generate_Report_BL
{
    public List<Shift_Timing> Get_Shift_Timing(string strShift_tName, string str_Shift_Complete_Details)
    {
        List<Shift_Timing> lstUser = new List<Shift_Timing>();
        try
        {
            DataSet ds = Application_Level_Processing_DL.Get_Shift_Timing(strShift_tName,str_Shift_Complete_Details);
            if (ds != null && ds.Tables.Contains("Shift_Timing"))
            { 
                lstUser = new Shift_Timing().getShift_Timing(ds.Tables["Shift_Timing"]);
            }
        }
        catch
        {
            throw;
        }
        return lstUser;
    }
}

这是我的数据层代码:

 public static DataSet Get_Shift_Timing(string strShift_tName, string str_Shift_Complete_Details)
    {
            DataSet dsReturn = new DataSet();
            Database db = DatabaseFactory.CreateDatabase();
            DbCommand command = db.GetStoredProcCommand("usp_Get_Shift_Timing");
            db.AddInParameter(command, "@Shift_Name", DbType.String, strShift_tName);
            db.AddInParameter(command, "@Shift_Complete_Details", DbType.String, str_Shift_Complete_Details);
            db.ExecuteDataSet(command);
            if (dsReturn != null && dsReturn.Tables.Count > 0)
            {
                dsReturn.Tables[0].TableName = "Shift_Timing";
            }
            return dsReturn;
    }

这是课程:

public class Shift_Timing
{
    public int Shift_ID { get; set; }
    public string Shift_Complete_Details { get; set; }
    public string Shift_Name { get; set; }
    public string Shift_From { get; set; }
    public string Shift_To { get; set; }
    public string RD_Code { get; set; }
    public string From_Date { get; set; }
    public string To_Date { get; set; }

    public List<Shift_Timing> getShift_Timing(DataTable dtShiftTime)
    {
        List<Shift_Timing> lstEntry = new List<Shift_Timing>();
        try
        {
            if (dtShiftTime.Rows.Count > 0)
            {
                lstEntry = dtShiftTime.AsEnumerable().Select(r => new Shift_Timing
                {
                    Shift_ID = r.Field<int>("Shift_ID"),
                    Shift_Complete_Details = r.Field<string>("Shift_Complete_Details"),
                    Shift_Name = r.Field<string>("Shift_Name"),
                    Shift_From = r.Field<string>("Shift_From"),
                    Shift_To = r.Field<string>("Shift_To"),
                    RD_Code = r.Field<string>("RD_Code"),
                    From_Date = r.Field<string>("From_Date"),
                    To_Date = r.Field<string>("To_Date"),
                }).ToList();
            }
        }
        catch
        {
            throw;
        }
        return lstEntry;
    }
}

1 个答案:

答案 0 :(得分:1)

对我来说,整体转换看起来不错,并带有几个建议(IMHO):

  • 应该在数据层和 业务层。想法是,如果您想更改数据访问权限 明天使用方法论,它不会影响您的业务层。 基本上,您的核心业务逻辑应该对外部没有影响 诸如如何持久化数据,如何在UI中表示数据等因素。
  • 在BL之间共享合同时,以上几点也适用 和用户界面(在您的示例中为Shift_Timing)通常可以实现 通过其中的服务适配器可以完成BO的转换 UI模型,反之亦然。
  • 您可能要考虑将数据层的依赖项注入 您的BL并通过interface访问它。这将使您的设计 可扩展的。