Было бы неплохо отказаться от второго требования избегать большого количества DLL. Если вы помещаете свой общий код в одну «общую» DLL, вам нужно перекомпилировать каждый раз, когда добавляется или изменяется любой класс. Это может привести к ужасной проблеме управления версиями, которая хуже, чем управление большим количеством DLL.
Вы должны сгруппировать ваш общий код по предоставляемым функциям в отдельные библиотеки DLL. Итак, один для доступа к данным, один для пользовательских элементов управления, один для каждого типа служебной функции и т. Д. Затем, если у вас есть веб-сервис, который обращается к данным, вам не нужно будет перекомпилировать сервис, когда вы добавляете новый пользовательский элемент управления в одну DLL , Только те приложения, которые зависят от изменений, должны быть перекомпилированы.