Похоже, вы попали в некоторые из распространенных ошибок, но не волнуйтесь, их можно исправить :)
Сначала вам нужно посмотреть на свое приложение немного по-другому и начать разбивать его на куски. Мы можем разделить куски в двух направлениях. Сначала мы можем отделить управляющую логику (бизнес-правила, код доступа к данным, код прав пользователя и все такое) от кода пользовательского интерфейса. Во-вторых, мы можем разбить код пользовательского интерфейса на куски.
Итак, сначала мы выполним последнюю часть, разбив пользовательский интерфейс на куски. Самый простой способ сделать это - создать единую форму хоста, на которой вы создадите свой пользовательский интерфейс с помощью пользовательских элементов управления. Каждый пользовательский элемент управления будет отвечать за область формы. Итак, представьте, что в вашем приложении есть список пользователей, и когда вы нажимаете на пользователя, текстовое поле под ним заполняется его данными. Вы могли бы иметь один пользовательский элемент управления, управляющий отображением списка пользователей, и второй, управляющий отображением данных пользователя.
Настоящая хитрость здесь заключается в том, как вы управляете связью между элементами управления. Вам не нужно, чтобы 30 пользовательских элементов управления в форме произвольно содержали ссылки друг на друга и вызывали методы для них.
Таким образом, вы создаете интерфейс для каждого элемента управления. Интерфейс содержит операции, которые примет элемент управления, и любые события, которые он вызывает. Когда вы думаете об этом приложении, вам все равно, изменится ли выбор списка в списке, вы заинтересованы в том, чтобы изменился новый пользователь.
Поэтому, используя наше приложение-пример, первый интерфейс для элемента управления, в котором размещается список пользователей, будет включать в себя событие UserChanged, которое передает объект пользователя.
Это здорово, потому что теперь, если вам надоест список, и вам нужен волшебный глазной контроль с 3d масштабированием, вы просто кодируете его в тот же интерфейс и подключаете его :)
Итак, часть вторая, отделяя логику пользовательского интерфейса от логики домена. Ну, это хорошо проработанный путь, и я бы посоветовал вам взглянуть на схему MVP здесь. Это действительно просто.
Каждый элемент управления теперь называется представлением (V в MVP), и мы уже рассмотрели большую часть того, что необходимо выше. В этом случае управление и интерфейс для него.
Все, что мы добавляем, это модель и ведущий.
Модель содержит логику, которая управляет состоянием вашего приложения. Вы знаете материал, он будет идти в базу данных, чтобы получить пользователей, записывать в базу данных при добавлении пользователя и так далее. Идея в том, что вы можете проверить все это в полной изоляции от всего остального.
Ведущий немного сложнее объяснить. Это класс, который находится между моделью и представлением. Он создается представлением, и представление переходит в презентатор, используя интерфейс, который мы обсуждали ранее.
У докладчика не должно быть собственного интерфейса, но мне все равно нравится его создавать. Делает то, что вы хотите, чтобы докладчик делал явно.
Таким образом, докладчик будет предоставлять такие методы, как ListOfAllUsers, которые View будет использовать для получения списка пользователей. В качестве альтернативы, вы можете добавить метод AddUser для View и вызвать его из презентатора. Я предпочитаю последнее. Таким образом, докладчик может добавить пользователя в список, когда он захочет.
Presenter также будет иметь такие свойства, как CanEditUser, который будет возвращать true, если выбранный пользователь может быть отредактирован. Затем представление будет запрашивать это каждый раз, когда ему нужно знать. Вы могли бы хотеть редактируемые в черном и читать только в сером. Технически это решение для View, поскольку оно ориентировано на пользовательский интерфейс, независимо от того, редактируется ли пользователь в первую очередь, для Presenter. Ведущий знает, потому что он разговаривает с моделью.
Итак, в заключение, используйте MVP. Microsoft предоставляет что-то под названием SCSF (Smart Client Software Factory), которая использует MVP, как я описал. Это также делает много других вещей. Это довольно сложно, и мне не нравится, как они все делают, но это может помочь.