[英]Initialization code in a WinForms App - Program.cs or MainForm?
我有一个Windows Forms应用程序,该应用程序当前在启动时加载数据库。 流程是这样的:
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);
当前,我在Program.cs中配置一个依赖注入容器,然后说
Application.Run(container.GetInstance<Form>());
我们当前正在开发的应用程序包含大约80个不同的应用程序部分。 当前,我们的MainForm的时钟为95行代码,并依赖于IApplicationModule (其唯一属性是返回“ TopControl”的接口), MenuStripModule , StatusBarModule和Session对象。
您可以为管理数据库创建一个Singleton对象(或延迟初始化),然后在代码的任何部分对其进行初始化:
public class DBProvider()
{
private static string DefaultConnectionString = "some connection string";
private static DBProvider instance
public static DBProvider GetInstance()
{
get
{
if (instance == null)
{
instance = new DBProvider(DefaultConnectionString);
}
return instance;
}
}
public DBProvider(string Connection string)
{
...
}
public static void Initialize (string ConnectionString)
{
instance = new DBProvider(ConnectionString);
}
}
您可以在Program.cs或MainForm ctor中对其进行初始化,并使用DBProvider.GetInstance();。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.