C# 如何在C语言中最小化窗体和类之间的依赖关系#

C# 如何在C语言中最小化窗体和类之间的依赖关系#,c#,.net,optimization,dependency-injection,C#,.net,Optimization,Dependency Injection,在这个示例代码(C#winForms应用程序)中,有一个带有SearchEmployee()方法的Employee类和一个带有GetByEmployeeID()方法的DataService类。搜索员工时,SearchEmployee()方法将调用GetByEmployeeID()方法与数据库对话。通过使用构造函数注入,我最小化了Employee类和DataService类之间的依赖关系。(以最简单的方式,不使用接口) 但是Formclass和Employeeclass之间存在依赖关系,因为Ine

在这个示例代码(C#winForms应用程序)中,有一个带有
SearchEmployee()
方法的
Employee
类和一个带有
GetByEmployeeID()方法的
DataService
类。搜索员工时,
SearchEmployee(
)方法将调用
GetByEmployeeID()
方法与数据库对话。通过使用构造函数注入,我最小化了
Employee
类和
DataService
类之间的依赖关系。(以最简单的方式,不使用接口)

但是
Form
class和
Employee
class之间存在依赖关系,因为I
new
Employee对象来自
from
class

这种依赖性是否会成为一个问题

如果应该避免这种依赖,最简单的方法是什么

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

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

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

我想说清楚:

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

这样,您的对象将只是信息载体,您将停止它们之间的依赖关系

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

这种依赖性是一个问题还是一个问题?-在您想如何完成任务之前,这不是一个问题

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

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

Ok如果EmployeeManager类或DataService类中有SearchEmployee(),我应该如何从表单调用此方法,并将txtEmpID.text作为参数传递?在这种情况下,可以使用依赖注入来最小化依赖性吗?如果是这样的话,你能用代码示例来回答吗?好的。但是表单和雇员之间的依赖关系呢?在这种情况下,如果应该避免依赖性,我们就不能使用类似DI的东西吗?除此之外,您是否看到我的示例代码中存在任何主要缺陷?当我试图用这种方式开发工资系统时,您当然可以在Form类中使用实体对象(在您的例子中是Employee)。我希望看到的是SOC(关注点分离)作为体系结构的一部分(与最新的ORM框架相比,您使用的是旧的ado.net)。fyr,你有没有检查实施DI。