Возможно, лучшее, что вы можете сделать, — это взглянуть на свой код с точки зрения принципа единой ответственности. . Одна из основных причин того, что автономное представление (и winforms, которое его поддерживает) так трудно тестировать, заключается в том, что разработчики склонны смешивать все вместе в обработчике событий.
Возьмите этот вопрос на SO - https://stackoverflow.com/questions/16599778/asp-net-mvc3-linq-make-multiple-related-rows-fields-in-a-1-to-many-relationshi, речь идет о MVC3, но это полный беспорядок - один метод, который отвечает за настройку представления сетки, настройку ответа и получение данных для заполнения представления сетки. Трудно даже понять, с чего начать отвечать на вопрос, не говоря уже о написании каких-либо разумных (читай: кратких и быстрых в выполнении) тестов, чтобы убедиться, что решение работает.
Если вы можете тщательно просмотреть свой код и тщательно инкапсулировать всю бизнес-логику и/или точки интеграции в сервисы/компоненты/интерфейсы (и реализации), предпочтительно в отдельные сборки снаружи.
После того, как вы разбили всю логику на отдельные компоненты, каждый из которых сосредоточен на своей задаче, вы можете писать тесты. затем, чтобы убедиться, что они выполняют задачу, для которой предназначены, без необходимости тестировать какую-либо другую часть вашего приложения, это будут ваши сервисы. Вы хотите, чтобы каждый тип службы был интерфейсом, поддерживаемым реализацией.
После того, как вы напишете и протестируете все эти разные проекты и сборки, вы вернете их обратно в свое приложение, используя инверсию управление (форма внедрения зависимостей). Это еще больше отделяет ваш пользовательский интерфейс от различной бизнес-логики, которую должно выполнять ваше приложение. Мечта здесь в том, что вы доберетесь до места, где, когда вы будете готовы переписать пользовательский интерфейс, вы сможете повторно использовать компоненты бизнес-логики, которые уже были написаны и протестированы.
Я думаю, что класс winform будет иметь конструктор, который принимает много аргументов (смесь различных сервисов, обсуждавшихся выше). Платформа DI будет отвечать за предоставление услуг классу winform. После этого, в идеале, ваши обработчики событий winforms будут относительно небольшими, просто вызывая методы службы со значениями параметров, собранными из различных полей формы.
Вот сообщение об использовании Castle Windsor (среда внедрения зависимостей ) с winforms: Использование Castle.Windsor с приложениями Windows Forms. Существует множество различных DI-фреймворков, я использую Castle Windsor, потому что это тот, который я изучил первым, все они делают по сути одно и то же, поэтому все, что вам нужно сделать, это найти тот, который вам удобен.
Вот руководство по разделению проблем который основан на веб-приложении, но должен быть инструктивным в отношении того, как идентифицировать и реорганизовать сервисы из существующего приложения "кухонная раковина".
Этот ответ превращается в книгу, и все это очень абстрактно. Главное, вам нужно думать о приложении как о наборе блоков лего, которые вы комбинируете для создания функциональности (каждый блок представляет собой проблему), а пользовательский интерфейс — это просто клей, который скрепляет блоки (эта аналогия не идеальна). .
На самом деле, это больше искусство, чем наука, но вы можете приучить свой ум смотреть на проблемы таким образом, и как только вы это сделаете, программирование в целом станет намного проще. Кривая немного крутая, но держитесь, и вы доберетесь туда.
person
Jason
schedule
17.05.2013