Код инициализации в приложении WinForms - Program.cs или MainForm?

2

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

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

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

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

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

Теги:
winforms

3 ответа

5
Лучший ответ

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

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

form = new MainForm();
form.DbName = "foo";
Application.Run(form);
2

В настоящее время я настраиваю контейнер для инъекций зависимостей в Program.cs, а затем скажу

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

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

0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню