如何在C#中最小化表单和类之间的依赖关系

时间:2014-04-15 07:26:37

标签: c# .net optimization dependency-injection

在此示例代码(C#winForms app)中,Employee类包含SearchEmployee()方法,DataService类包含GetByEmployeeID()方法。搜索员工时,SearchEmployee()方法将调用GetByEmployeeID()方法与数据库通信。我已经通过使用构造函数注入最小化了Employee类和DataService类之间的依赖关系。 (以最简单的方式使用接口)

但是Form类和Employee类之间存在依赖关系,因为来自new类的From员工对象。

这种依赖性是一个问题还是不是?

如果应该避免这种依赖,那么实现这一目标的最简单方法是什么?

我不喜欢使用像MVP这样的模式,因为我不熟悉它。

Class Form
{
    public Form()
    {
        InitializeComponents();
    }

        private void btnSave_Click(object sender, EventArgs e)
        {
                Employee newEmp = new Employee (new DataService()); //Making a dependency 
                newEmp = newEmp.SearchEmployee (txtEmployeeID.Text);
                txtEmployeeName.Text = newEmp.EmployeeName;
                txtEmployeeAddress.Text = newEmp.EmployeeAddress;
        }
}


Class Employee
{
        string EmployeeID  { get; set; }
        string EmployeeName { get; set; }
        string EmployeeAddress { get; set; }

        DataService _DS;

        public Employee(DataService DS) //Constructor injection of dataservice object
        {
            this._DS = DS;
        }

        public Employee SearchEmployee (string employeeID)
        {
            this.EmployeeID  =employeeID;

            DataTable DT= _DS.GetByEmployeeID(EmployeeID);
            this.EmployeeName = DT.Rows[0].ItemArray[1].ToString();
            this.EmployeeAddress = DT.Rows[0].ItemArray[2].ToString();

            return this; //Returning an employee object to the caller
        }
}


//This class responsible for database transaction

 class DataService
    {

        public DataTable GetByEmployeeID(string employeeID)
        {
            using (SqlConnection newCon = new SqlConnection(db.GetConnectionString))
            {
                SqlCommand Cmd = new SqlCommand("SELECT..WHERE emp_id=@employeeID", newCon);
                Cmd.Parameters.Add("@employeeID", SqlDbType.varChar).Value = employeeID;
                newCon.Open();
                SqlDataReader rdr = Cmd.ExecuteReader();
                DataTable results = new DataTable();
                results.Load(rdr);

                return results;
            }
        }
    }

2 个答案:

答案 0 :(得分:2)

实际上,代表实体的类应包含与该实体相关的信息。

属于实体管理的任何方法,比如查找特定对象,告诉哪些包含一组属性等,应该在不同的类中。

说清楚我的观点:

您可以让您的“员工”只有3个字符串属性,然后是“EmployeeManager”,负责搜索员工,包含所有员工的列表,按ID查找等。

这样,你的对象将只是信息载体,你将制造它们之间的依赖关系。

在您的情况下,在数据服务上使用“SearchEmployee”方法更有意义。

答案 1 :(得分:0)

这种依赖性是一个问题还是不是? - 在你想要完成任务之前,这不是问题。< / p>

如果应该避免这种依赖性。? - 是的。您的程序只有一个工作单元是GetByEmployeeID(字符串employeeID)。依赖注入(DI)应该在员工对象需要其他对象(如部门)时使用(这将成为员工对象的依赖关系,并且将通过构造函数模式注入)。在您的程序中,依赖项就像服务一样,因此几乎不可能根据调用者改变其行为。 DI还简化了测试/模拟对象,测试员工对象将无需测试它的依赖性,即部门。

实现这一目标的最简单方法是什么?我不喜欢使用像MVP这样的模式,因为我不熟悉它。 - 嗯,最简单的需要坚实的基础/架构,然后你的程序将能够在相当多的代码行中完成这个任务。您可以使用ORM(对象关系映射器)框架,如Microsoft实体框架,它简化了域/数据/存储库/工作单元部分。