【问题标题】:Conversion of 2 Tier Architecture to 3 Tier Architecture将 2 层架构转换为 3 层架构
【发布时间】:2019-03-07 06:09:18
【问题描述】:

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

我使用 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;
    }
}

【问题讨论】:

  • 您的类不应依赖于数据层列名。这将使您的 3 层方法完全没有意义。

标签: c# architecture


【解决方案1】:

对我来说,有几个建议(恕我直言),整体转换看起来不错:

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

【讨论】:

    猜你喜欢
    • 2010-12-09
    • 2011-07-30
    • 1970-01-01
    • 1970-01-01
    • 2011-09-30
    • 1970-01-01
    • 2012-07-21
    • 1970-01-01
    • 2011-02-06
    相关资源
    最近更新 更多