Я бы начал с серии Джереми Миллера "Создай свою собственную кабину ".
Я был ранним последователем CAB. Я многому научился, изучая эту технологию и читая все блоги .NET об архитектуре приложений.
Но недавно у меня была возможность начать новый проект, и вместо использования CAB я пошел с StructureMap и NHibernate и позаимствовал некоторые из шаблонов, которые использует Джереми (в частности, его способ обработки агрегации событий). Результатом стал действительно упрощенный фреймворк с ручным управлением, который делает все, что мне нужно, и мне нравится работать с ним.
Что касается специфики вашего вопроса: я использую репозиторий для доступа к данным. Первоначально я написал некоторый код ADO.NET, использовал устройства чтения данных и отображал свои объекты. Но это очень быстро устарело, поэтому я взял NHibernate и был очень доволен. Репозитории используют NHibernate для доступа к данным, и мои потребности в доступе к данным довольно просты в этом конкретном приложении.
У меня есть сервисный уровень (предоставляемый через WCF, дуплексные каналы), который использует репозитории. Мое приложение в основном клиент-серверное с обновлением в реальном времени (и я знаю, что ваш вопрос был только о клиентах, но я бы использовал те же технологии и шаблоны). O
На стороне клиента я использую MVP с StructureMap для IoC и некоторые очень простые стратегии агрегации событий для межклассовой связи. Я кодирую интерфейсы практически для всего. Единственное, что я сделал, - это позаимствовал у CAB идею гибкого «рабочего пространства» для динамического отображения представлений. Я написал свой собственный интерфейс Workspace и реализовал свои собственные DeckWorkspace и TableWorkspace для использования в моем приложении (это были действительно простые вещи для написания).
Многие мои решения в этом последнем приложении были результатом опыта и боли, которые я испытывал, используя другие фреймворки и инструменты. На этот раз я принял разные решения. Возможно, единственный способ по-настоящему понять, как создать приложение, - это почувствовать боль от неправильного выполнения этого заранее.