在此示例代码(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;
}
}
}
答案 0 :(得分:2)
实际上,代表实体的类应包含与该实体相关的信息。
属于实体管理的任何方法,比如查找特定对象,告诉哪些包含一组属性等,应该在不同的类中。
说清楚我的观点:
您可以让您的“员工”只有3个字符串属性,然后是“EmployeeManager”,负责搜索员工,包含所有员工的列表,按ID查找等。
这样,你的对象将只是信息载体,你将制造它们之间的依赖关系。
在您的情况下,在数据服务上使用“SearchEmployee”方法更有意义。
答案 1 :(得分:0)
这种依赖性是一个问题还是不是? - 在你想要完成任务之前,这不是问题。< / p>
如果应该避免这种依赖性。? - 是的。您的程序只有一个工作单元是GetByEmployeeID(字符串employeeID)。依赖注入(DI)应该在员工对象需要其他对象(如部门)时使用(这将成为员工对象的依赖关系,并且将通过构造函数模式注入)。在您的程序中,依赖项就像服务一样,因此几乎不可能根据调用者改变其行为。 DI还简化了测试/模拟对象,测试员工对象将无需测试它的依赖性,即部门。
实现这一目标的最简单方法是什么?我不喜欢使用像MVP这样的模式,因为我不熟悉它。 - 嗯,最简单的需要坚实的基础/架构,然后你的程序将能够在相当多的代码行中完成这个任务。您可以使用ORM(对象关系映射器)框架,如Microsoft实体框架,它简化了域/数据/存储库/工作单元部分。