Код инициализации в приложении WinForms - Program.cs или MainForm? - PullRequest
2 голосов
/ 03 августа 2009

У меня есть приложение Windows Forms, которое в данный момент загружает базу данных при запуске. Поток такой:

Program.cs => Application.Run (new MainForm ()); => Конструктор MainForm => Открыть базу данных

Таким образом, в основном MainForm содержит все фрагменты, которые запускают приложение, в то время как Program.cs - просто заглушка. В настоящее время имя загружаемой базы данных жестко закодировано, и я хочу добавить функциональность, чтобы указать имя базы данных для загрузки через командную строку. В то же время я хочу добавить возможность проводить некоторое модульное тестирование или даже инъекцию зависимостей, поэтому мне интересно, какой подход рекомендуется?

  • Измените конструктор MainForm для принятия некоторых параметров. Затем измените Program.cs для чтения командной строки и измените вызов на Application.Run(new MainForm()); соответственно
  • Оставьте Program.cs и подпись конструктора без изменений и проверьте командную строку в конструкторе MainForm

Первый способ кажется более чистым, поскольку он позволяет, например, организатору тестов создавать MainForm с тестовой базой данных, но, поскольку я обычно не являюсь разработчиком WinForms, я не знаю, могут ли быть побочные эффекты отсутствия использования по умолчанию конструктор в главной форме или есть ли лучший подход?

Ответы [ 3 ]

5 голосов
/ 03 августа 2009

Я думаю, что это сводится к разделению проблем. Класс Program должен быть связан с деталями уровня приложения, а MainForm - с деталями формы. Тогда это говорит мне, что эта Программа должна проанализировать командную строку и передать имена в форму.

Вы все еще можете оставить конструктор по умолчанию в форме и либо пометить его как закрытый, либо выдать ошибку, если вы его выполните. Или вы все равно можете сделать так, чтобы Program.cs использовал конструктор по умолчанию для создания формы и просто вставлял имя базы данных с параметрами (так что это либо инжекция конструктора, либо инъекция параметра), что-то вроде

form = new MainForm();
form.DbName = "foo";
Application.Run(form);
2 голосов
/ 03 августа 2009

В настоящее время я настраиваю контейнер внедрения зависимостей в Program.cs и затем говорю

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

Приложение, которое мы сейчас разрабатываем, содержит около 80 различных частей приложения. Наша MainForm в настоящее время имеет 95 строк кода и имеет зависимости от IApplicationModule (интерфейс, единственным свойством которого является возвращение "TopControl"), MenuStripModule , StatusBarModule и объект Session .

0 голосов
/ 03 августа 2009

Вы можете создать объект 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 ();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...