如何在C#中最小化表单和类之间的依赖关系 [英] how to minimize dependency between a form and a class in C#

查看:67
本文介绍了如何在C#中最小化表单和类之间的依赖关系的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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



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



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



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

如果你能回答代码,请感谢。



我不喜欢使用类似MVP的模式,因为我不熟悉它。



In this sample code (C# winForms app) there is a `Employee` class with `SearchEmployee()` method and a `DataService` class with `GetByEmployeeID()` method. When searching for a employee, `SearchEmployee(`) method will call `GetByEmployeeID()` method to talk to database. I have minimized the dependency between `Employee` class and `DataService` class by using constructor injection. (in its simplest way with out using an Interface)

But there is a dependency between `Form` class and `Employee` class as I `new` employee object from `From` class.

Will that dependency be a problem or isn't?

If that dependency should be avoided, What is the simplest way to achieve this?
Appreciate if you could answer with code.

I prefer not to use a pattern like MVP as I'm not familiar with it.

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;
                }
            }
        }

推荐答案

为了利用松散耦合,我建议你改变你的设计并像这样使用MVC;



To take advantage of loose coupling, I suggest you to change your design and use MVC like this;

[STAThread]
static void Main()
{
	Application.EnableVisualStyles();
	Application.SetCompatibleTextRenderingDefault(false);

	var view = new FormMain();
	var controller = new Controller(view, new EmployeeManager(new DataService()));

	Application.Run(view);
}


public partial class FormMain : Form
{
	private Controller _controller;

	public FormMain()
	{
		InitializeComponent();
	}

	public void SetController(Controller controller)
	{
		_controller = controller;
	}

	private void button1_Click(object sender, EventArgs e)
	{
		var newEmp = _controller.SearchEmployee(txtEmployeeID.Text);
                if(null == newEmp) 
                {
                   //Id is not found.
                }
		txtEmployeeName.Text = newEmp.EmployeeName;
		txtEmployeeAddress.Text = newEmp.EmployeeAddress;
	}
}

public class Controller
{
	private FormMain _view;
	private EmployeeManager _manager;


	public Controller(FormMain view, EmployeeManager manager)
	{
		_view = view;
		_manager = manager;
		view.SetController(this);
	}

	public Employee SearchEmployee(string employeeID)
	{
	   return _manager.SearchEmployee(employeeID);
	}

	private void UpdateService(DataService newService)
	{
		_manager = new EmployeeManager(newService);
	}

}

public class EmployeeManager
{

	private DataService _ds;

	public EmployeeManager(DataService DS)
	{
		_ds = DS;
	}

	public Employee SearchEmployee(string employeeID)
	{

		var dt = _ds.GetByEmployeeId(employeeID);

		if (dt.Rows.Count > 0)
		{

			return new Employee(employeeID,
								dt.Rows[0].ItemArray[1].ToString(),
								dt.Rows[0].ItemArray[2].ToString());
		}
		return null;
	}

	//ADD DELETE UPDATE METHODS etc.

}

public class Employee
{
	public string EmployeeID { get; set; }
	public string EmployeeName { get; set; }
	public string EmployeeAddress { get; set; }


	public Employee(string employeeID, string employeeName, string employeeAddress)
	{
		EmployeeID = employeeID;
		EmployeeName = employeeName;
		EmployeeAddress = employeeAddress;
	}
}

public class DataService
{
	public DataTable GetByEmployeeId(string employeeID)
	{
		using (SqlConnection newCon = new SqlConnection(""))
		{
			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;
		}
	}
}


好点。我建议你去看看 MEF [ ^ ]。顺便提一下,这些天我见过的最好的问题之一。
good point. I advice you to take a look to MEF[^]. one of the best questions I have seen in these days, by the way.


这篇关于如何在C#中最小化表单和类之间的依赖关系的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆