C# 如何在C语言中最小化窗体和类之间的依赖关系#
在这个示例代码(C#winForms应用程序)中,有一个带有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
SearchEmployee()
方法的Employee
类和一个带有GetByEmployeeID()方法的DataService
类。搜索员工时,SearchEmployee(
)方法将调用GetByEmployeeID()
方法与数据库对话。通过使用构造函数注入,我最小化了Employee
类和DataService
类之间的依赖关系。(以最简单的方式,不使用接口)
但是Form
class和Employee
class之间存在依赖关系,因为Inew
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。