繁体   English   中英

WinForms应用程序中的初始化代码-Program.cs还是MainForm?

[英]Initialization code in a WinForms App - Program.cs or MainForm?

我有一个Windows Forms应用程序,该应用程序当前在启动时加载数据库。 流程是这样的:

Program.cs => Application.Run(new MainForm()); => MainForm构造函数=>打开数据库

因此,基本上MainForm包含使应用程序运行的所有细节,而Program.cs只是一个存根。 当前,已加载的数据库的名称是硬编码的,我想添加功能以指定要通过命令行加载的数据库的名称。 同时,我想稍后再添加进行某些单元测试甚至依赖注入的功能,所以我想知道推荐哪种方法?

  • 更改MainForm的构造函数以接受一些参数。 然后,更改Program.cs以读取命令行,并将调用更改为Application.Run(new MainForm()); 于是
  • 保持Program.cs和构造函数的Signature不变,并检查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”的接口), MenuStripModuleStatusBarModuleSession对象。

您可以为管理数据库创建一个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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM