Пока вы уверены, что разрабатываете на основе интерфейса, а не реализации, это определенно будет работать.
Мы разрабатываем приложения с архитектурой, аналогичной той, которую вы предлагаете.
Наш уровень представления использует MVP, поэтому мы можем делиться нашими докладчиками между веб-формами ASP.NET и другими внешними интерфейсами. В этом мы используем ServiceFactory, который использует внедрение зависимостей для создания наших сервисов. Это может быть клиентский прокси WCF или прямой сервис. Теперь докладчику не нужно, если вызов идет через WCF или напрямую.
В нашем слое Service мы используем UnitOfWork, который оборачивает набор репозиториев. UoW также построен через DI.
Мы используем Entity Framework и генерируем из него объекты POCO. Мы только решили не передавать POCO полностью на уровень представления / просмотра, но только на уровне бизнеса и обслуживания. Из уровня сервиса для просмотра мы используем собственные DTO. В настоящее время EF и UoW живут в одном проекте. Мы могли бы переместить их в другую сборку и загрузить их оттуда, но на практике это не имело бы никакого значения (и мы хотим избежать взрыва целого числа проектов при каждой загрузке файла решения).
Мы выполняем нашу проверку частично в объектах POCO и на уровне обслуживания (который сопоставляет DTO с POCO и может проверять данные). Также мы проверяем входящие данные в докладчике и в javascript в представлении (для удобства пользователей). В настоящее время мы не используем инструмент для проверки.
И да, у нас есть тестовый проект для каждого слоя.
Мы тестируем докладчиков, сервисы и UoW / репозитории. На нашем сервере сборки мы запускаем непрерывную интеграцию, которая запускает все модульные тесты в нескольких различных настройках (в памяти, для базы данных, с использованием WCF).
Конечно, если вы будете тестировать только своих докладчиков, это также затронет службы и слой данных, но если вы будете имитировать все зависимости, вы можете протестировать каждый слой изолированно (особенно в тех случаях, когда другой слой должен выдать ошибку или что-то такое, что это намного проще сделать, когда вы высмеиваете весь слой).
Единственное, на что я сейчас смотрю, это тестирование реальных представлений. В настоящее время мы не тестируем их автоматически. Может быть, мы собираемся использовать тесты Coded UI или какой-то фреймворк javascript.