Сначала я искал и гуглил, думая, что наверняка кто-то уже спрашивал об этом раньше, но я точно не могу найти хорошее описание этой проблемы.
У меня есть шесть или восемь аналогичных приложений WinForms на C # .NET 2.0, построенных с довольно распространенной моделью главного окна приложения с несколькими полями данных графического интерфейса пользователя и несколькими модальными диалоговыми окнами для дальнейшего сбора данных. Многие из полей данных (особенно TextBoxes) имеют идентичные процедуры проверки данных. Я пишу одни и те же подпрограммы xxx_Validating () снова и снова, которые в простейшем случае используют только заглавные буквы первого символа введенного текста (если есть) и переотображают результат. У меня есть еще один для полей почтового индекса, который берет первые 3 цифры 5-значного почтового почтового индекса США и возвращает соответствующее состояние, используя массив строк из 1000 членов. Простые вещи Есть несколько других; Вот пример:
public void CapFirstCharTextBox_Validating(object sender, CancelEventArgs e)
{
string strValue = ((TextBox)sender).Text.Trim();
if (strValue.Length >= 1) {
if (char.IsLower(strValue[0])) {
strValue = strValue.Substring(0, 1).ToUpper() + strValue.Substring(1);
((TextBox)sender).Text = strValue; // fires (whatever sender)_TextChanged()
}
}
}
Опять же, это часть полдюжины таких "полезных" процедур. У меня есть только один набор из них для каждого класса диалогового окна, и все различные TextBox в этом диалоговом окне, которые нуждаются в этом, имеют свое событие Validating, указывающее на один и тот же метод. Так что не похоже, что у меня есть 20 из них в данном исходном файле (по одному для каждого TextBox) или что-то еще; есть только один для всего класса диалога.
Проблема в том, что все они существуют в каждом исходном файле, где они мне нужны. Это один набор для главного окна и больше для каждого всплывающего диалогового окна - и это слишком много. Я понимаю, что классы модальных диалоговых окон не могут общаться друг с другом, и сделать все эти вещи глобальными в лучшем случае неуловимо, а в худшем - большим «нет-нет».
Я успешно попытался передать ссылку на «FormMain» (где существует одна копия этих подпрограмм) различным конструкторам диалогов, а затем вызвал эти подпрограммы проверки вместе с их собственными обработчиками проверки. Это работает, но кажется ужасно неуклюжим и, конечно, не лучшим подходом.
Итак, как бы я (или я бы хотел) перестроить проект и организовать код лучше, чтобы иметь только один экземпляр подобных вещей? Как бы я подключил глобальный «служебный» класс таких методов, чтобы я мог получить к нему из кода основной формы, а также из набора всплывающих модальных диалоговых окон?
Я бы хотел сохранить только один исполняемый файл без дополнительных .DLL-файлов, если это возможно (это, кстати, все по одному проекту на решение), и, если это целесообразно, я бы хотел еще больше поделиться этим общий код для нескольких решений.
Я думаю, что ответ будет включать в себя написание новых сборок, использование разных пространств имен (в настоящее время весь мой код в данном проекте содержится в одном и том же пространстве имен) и, возможно, разделение этого материала на собственный проект в том же файле решения.
Возможно ли это?