Интересно, что вопрос рядом с этим вопросом в «активной» группе тега «Architecture»: .NET N-Tier Architecture: Что мне делать с объектами Model? и, кажется, ему было уделено гораздо больше внимания, чем этому, несмотря на то, что он очень похож.
В любом случае, не особенно в отношении .Net / WCF / WPF, все зависит от того, к какому типу гибкости вы стремитесь (или от ваших требований). Для меня нет ничего плохого в том, что вы делаете, и, в общем и целом, ИМХО, это самый умный подход, так как он освобождает вас от жесткости хранилища данных.
Помните, что если вы разрешаете внешним системам подключаться к вашей (например, через веб-API), вы должны , а не выставлять свой DAL. Даже BLL должен быть заключен в тонкий слой, чтобы вы могли абстрагироваться от конкретных потребностей транспортного уровня (чего и пытается достичь WCF, но этого может быть недостаточно, если у вас есть особая бизнес-логика для определенного транспортного канала - ключи API, и др.).
Наибольшим преимуществом является возможность настраивать ваши DTO в зависимости от вызываемых сервисов. В качестве примера рассмотрим веб-API LinkedIn. Они позволяют клиентам «запрашивать» данные, которые ему нужны, в любой момент времени и формировать конкретное представление набора данных, адаптированное к его потребностям, уменьшая использование полосы пропускания (для каждой службы API клиент не получает весь набор данных, просто конкретное мнение, которое оно запрашивает). Это веб-пример, но шаблон дизайна может также применяться к толстым клиентам.
Что касается производительности, то, безусловно, будет иметь место преобразование сущностей в DTO для просмотра объектов и т. Д. Но сначала проверьте, не связана ли производительность вашей системы с другими факторами (база данных, память, многопоточность и т. Д.). Опция DTO может быть даже быстрее, в зависимости от того, как вы строите свои сервисы, поскольку вы можете посылать намного меньше информации по сети. Вероятно, более важно тщательно спроектировать свой BLL, чтобы вы брали объект в DTO для обсуждения объекта. То же самое относится ко всем остальным слоям в вашей системе (услуги по представлению и т. Д.).