2

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

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

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

  • 更改 MainForm 的构造函数以接受一些参数。Application.Run(new MainForm());然后更改Program.cs以读取命令行并将调用更改为
  • 保持 Program.cs 和构造函数的签名不变,并检查 MainForm 构造函数中的命令行

方法一似乎更干净,因为它允许测试运行程序使用测试数据库创建 MainForm,但由于我通常不是 WinForms 开发人员,我不知道在没有默认构造函数的情况下是否会产生副作用主要形式还是有更好的方法?

4

3 回答 3

5

我认为这归结为关注点分离。Program 类应该关注应用程序级别的详细信息,而 MainForm 应该关注表单的详细信息。然后这告诉我该程序应该解析命令行并将名称传递给表单。

您仍然可以将默认构造函数保留在表单上,​​并将其标记为私有或在执行时抛出错误。或者您仍然可以让 Program.cs 使用默认构造函数来创建表单并简单地使用参数注入数据库名称(因此它是构造函数注入或参数注入),例如

形式 = 新的 MainForm();
form.DbName = "foo";
应用程序.运行(窗体);
于 2009-08-03T08:13:45.437 回答
2

目前,我在 Program.cs 中配置了一个依赖注入容器,然后说

Application.Run(container.GetInstance<Form>());

我们目前正在开发的应用程序有大约 80 个不同的应用程序部分。我们的 MainForm 目前有 95 行代码,并且依赖于IApplicationModule(其唯一属性是返回“TopControl”的接口)、MenuStripModuleStatusBarModuleSession对象。

于 2009-08-03T08:23:07.287 回答
0

您可以为管理 DB 创建一个 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();

于 2009-08-03T08:33:06.907 回答