Рассмотрим свою цель, прежде чем начать.Вы хотите стремиться к ТВЕРДЫМ принципам , по моему мнению.Это означает, среди прочего, что класс / метод должен иметь одиночную ответственность .В вашем случае код вашей формы, вероятно, координирует элементы пользовательского интерфейса и бизнес-правил / доменных методов.
Разбивка на usercontrols - хороший способ начать.Возможно, в вашем случае каждая вкладка будет иметь только один пользовательский контроль, например.Затем вы можете сделать код формы очень простым, загружая и заполняя пользовательские элементы управления.У вас должна быть реализация командного процессора, которую эти пользовательские контроллеры могут публиковать / подписывать, чтобы обеспечить возможность межвидового общения.
Кроме того, исследуйте шаблоны проектирования пользовательского интерфейса. MVC очень популярен и хорошо зарекомендовал себя, хотя его трудно реализовать в современных приложениях на основе настольных компьютеров.Это дало начало шаблонам MVP / пассивного просмотра и MV-VM .Лично я предпочитаю MVVM, но вы можете в конечном итоге создать много «фреймворк-кода» при реализации в WinForms, если не будете осторожны - оставайтесь простыми.
Кроме того, начните думать в терминах «Задачи» или«Действия», следовательно, создают основанный на задачах пользовательский интерфейс , а не то, что составляет create / read / update / delete (CRUD) UI.Считайте, что объект, связанный с первой вкладкой, является совокупным корневым и имеет кнопки / панели инструментов / ярлыки ссылок, по которым пользователи могут нажимать для выполнения определенных задач.Когда они это делают, они могут перейти на совершенно другую страницу, которая объединяет только определенные поля, необходимые для выполнения этой работы, что устраняет сложность.
Командный процессор
Шаблон Командный процессор:в основном синхронный шаблон издатель / потребитель для событий, инициируемых пользователем.Ниже приведен базовый (и довольно наивный) пример.
По сути, с помощью этого шаблона вы пытаетесь добиться перемещения обработки событий из самой формы.Форма может по-прежнему иметь дело с такими проблемами пользовательского интерфейса, как скрытие / удаление элементов управления, анимация и т. Д., Но вы стремитесь к четкому разделению проблем для реальной бизнес-логики.Если у вас модель обогащенного домена , «обработчики команд» по существу будут координировать вызовы методов в модели домена.Командный процессор сам по себе дает вам удобное место для переноса методов-обработчиков в транзакциях или для предоставления таких вещей в стиле AOP , как аудит и ведение журнала.
public class UserForm : Form
{
private ICommandProcessor _commandProcessor;
public UserForm()
{
// Poor-man's IoC, try to avoid this by using an IoC container
_commandProcessor = new CommandProcessor();
}
private void saveUserButton_Click(object sender, EventArgs e)
{
_commandProcessor.Process(new SaveUserCommand(GetUserFromFormFields()));
}
}
public class CommandProcessor : ICommandProcessor
{
public void Process(object command)
{
ICommandHandler[] handlers = FindHandlers(command);
foreach (ICommandHandler handler in handlers)
{
handler.Handle(command);
}
}
}