我有一个Windows窗体应用程序,当前在启动时加载数据库.流程是这样的:
Program.cs => Application.Run(new MainForm()); => MainForm构造函数=>打开数据库
所以基本上MainForm包含使应用程序运行的所有部分,而Program.cs只是一个存根.目前,加载的数据库的名称是硬编码的,我想添加功能以指定要通过命令行加载的数据库的名称.同时,我想添加稍后进行单元测试甚至依赖注入的能力,所以我想知道推荐哪种方法?
Application.Run(new MainForm());相应的方法一似乎更干净,因为它允许测试运行器使用测试数据库创建MainForm,但由于我通常不是WinForms开发人员,我不知道是否可能存在没有默认构造函数的副作用主要表格还是有更好的方法?
我认为这归结为关注点的分离.Program类应该关注应用程序级别的详细信息,MainForm应该关注表单的详细信息.然后,我告诉我该程序应该解析命令行并将名称传递给表单.
您仍然可以在表单上保留默认构造函数,并将其标记为私有或在执行时抛出错误.或者您仍然可以让Program.cs使用默认构造函数来创建表单,并简单地使用参数注入数据库名称(因此它可以是构造函数注入或参数注入),类似于
form = new MainForm(); form.DbName = "foo"; Application.Run(form);