#winforms #namespaces #.net-2.0 #assemblies #organization
#winforms #пространства имен #.net-2.0 #сборки #организация
Вопрос:
Сначала я искал и гуглил, думая, что наверняка кто-то задавал этот вопрос раньше, но я уверен, что не могу найти хорошего описания этой проблемы.
У меня есть шесть или восемь похожих приложений WinForms на C # .NET 2.0, построенных по довольно распространенной модели главного окна приложения с несколькими полями данных GUI плюс несколько модальных диалоговых окон для дальнейшего сбора данных. Многие поля данных (особенно текстовые поля) имеют идентичные процедуры проверки данных. Я снова и снова пишу одни и те же процедуры 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()
}
}
}
Опять же, это часть примерно полудюжины таких «служебных» подпрограмм. У меня есть только один набор из них для каждого класса диалогового окна, и все различные текстовые поля в этом диалоговом окне, которым это необходимо, имеют событие проверки, указывающее на один и тот же метод. Таким образом, у меня не похоже, что у меня их 20 в данном исходном файле (по одному для каждого текстового поля) или что-то еще; есть только один для всего класса dialog.
Проблема в том, что весь их набор существует в каждом исходном файле, где они мне нужны. Это один набор для главного окна и больше для каждого всплывающего диалогового окна — и это слишком много. Я понимаю, что классы модальных диалоговых окон не могут взаимодействовать друг с другом, и сделать все это глобальным в лучшем случае неуловимо, а в худшем — категорически «нет-нет».
Я успешно попытался передать ссылку на «FormMain» (где существует одна копия этих подпрограмм) различным конструкторам диалоговых окон, а затем вызвать эти процедуры проверки с помощью этого из их собственных обработчиков проверки. Это работает, но кажется ужасно неуклюжим и, конечно, не похоже на лучший подход.
Итак, как бы мне (или я хотел бы) изменить проект и лучше организовать код, чтобы иметь только один экземпляр такого рода вещей? Как бы я подключил глобальный «служебный» класс таких методов, чтобы я мог получить к нему доступ из кода основной формы, а также из множества всплывающих модальных диалоговых окон?
Я хотел бы поддерживать только один исполняемый файл без дополнительных.Библиотеки DLL, если это возможно (все они предназначены для одного проекта на решение, кстати), и, если это практически возможно, я хотел бы в дальнейшем иметь возможность совместно использовать этот общий код в нескольких решениях.
Я думаю, что ответ будет включать в себя написание новых сборок, использование разных пространств имен (в настоящее время весь мой код в данном проекте содержится в одном пространстве имен) и, возможно, разделение этого материала на отдельный проект в том же файле решения.
Возможно ли это?
Ответ №1:
Вы можете совместно использовать код в разных решениях, сохраняя код в одном месте и добавляя ссылку на файл в каждом решении.
Чтобы добавить ссылку: щелкните правой кнопкой мыши проект (или папку), в который вы хотите добавить код, затем выберите «Добавить существующий элемент», найдите файл, когда найдете, нажмите стрелку вниз на кнопке и выберите «Ссылка на».
Таким образом, проекты, которые ссылаются на файл, будут использовать один и тот же код.
КСТАТИ: будьте осторожны при использовании системы управления версиями, которая не знает, как обрабатывать эти ссылки.
Комментарии:
1. Спасибо; Я думаю, что это часть решения (без каламбура). Мы используем SVN, и я понимаю, что он не предоставляет общий доступ к файлам. Более важный вопрос заключался в том, как обернуть эти методы в какую-то новую сборку / пространство имен / класс и вызвать их из существующего кода, будь то основная форма или класс формы отдельного диалогового окна.
2. Можете ли вы изменять существующий код? Есть несколько вариантов: например, dll или сервис.
3. Кстати: Я согласен с Гансом, но я пытался показать вам, как решить техническую часть вопроса, который вы задали.
4. Да, у меня есть доступ ко всей базе кода (я работаю в одиночку). Я бы предпочел не отправлять одну или несколько библиотек DLL или устанавливать и поддерживать сервис для чего-то, что должно быть простым. Это технические детали, которые мне нужны… могу ли я переместить часть этого материала в новое пространство имен и выполнять вызовы в нем из нескольких разных классов? Или это будет отдельная сборка? У меня C-образ мышления с хорошим знанием C , но, я думаю, это проблема, зависящая от конкретной платформы. Также подавляющее большинство этих вызовов должно исходить из InitializeComponent() внутри FormBlah. Designer.cs, если это возможно.
5. Вы можете использовать любое пространство имен, которое хотите; это просто (часть) имени. Вы можете вызвать его из любого места, если знаете пространство имен и имеете доступ к сборке. Если вы не знаете этих вещей, вы действительно знаете слишком мало, чтобы принимать правильные решения. Да, изучите платформу. Держитесь подальше от InitializeComponent() этот метод (повторно) генерируется разработчиком формы. Используйте событие загрузки. Действительно, вы создаете настоящий беспорядок.