У меня есть приложение Windows Forms, которое в настоящее время загружает базу данных при запуске. Поток выглядит следующим образом:
Program.cs = > Application.Run(новый MainForm()); = > MainForm Constructor = > Открыть базу данных
Итак, в основном MainForm содержит все бит и куски, которые заставляют приложение запускаться, в то время как Program.cs - это просто заглушка. В настоящее время имя загруженной базы данных жестко запрограммировано, и я хочу добавить функциональность, чтобы указать имя базы данных для загрузки через командную строку. В то же время я хочу добавить возможность выполнить некоторое тестирование единицы или даже инъекцию зависимостей, поэтому я задаюсь вопросом, какой подход рекомендуется использовать?
Application.Run(new MainForm());
соответственноМетод один кажется более чистым, поскольку он позволяет, например, тестировать бегун для создания MainForm с тестовой базой данных, но поскольку я обычно не разработчик WinForms, я не знаю, могут ли быть побочные эффекты отсутствия дефолта конструктор на главной форме или если есть лучший подход?
Я думаю, что это сводится к разделению проблем. Класс программы должен быть связан с деталями уровня приложения и MainForm с данными формы. Затем это говорит мне, что программа должна анализировать командную строку и передавать имена в форму.
Вы все равно можете оставить конструктор по умолчанию в форме и либо пометить его как private, либо выбросить ошибку, если вы его выполнили. Или у вас все еще может быть 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();