Основная проблема с вашей реализацией заключается в том, что прокси WCF недешевы. Отражение не причинит вам большого вреда, но создание нового прокси-сервера для каждого запроса (и, между прочим, неправильное его использование) определенно будет.
Основная проблема с дизайном заключается в том, что предполагается, что каждый тип объекта поддерживает один и тот же контракт / интерфейс CRUD. В действительности у вас могут быть такие, которые предназначены только для чтения (начальная загрузка и другие метаданные), некоторые - только для CR (журнальные или транзакционные данные), некоторые - только для CRU (критические базовые данные, такие как «хранилище» или «учетная запись»). ") и некоторые, которые вообще не являются истинными сущностями и требуют дополнительных параметров для извлечения. Кроме того, вам, вероятно, понадобится несколько методов типа «GetByID / GetByXYZ», которые варьируются от одного типа к другому; редко потребитель действительно хотел бы перечислить каждый элемент, содержащийся в базе данных, без какого-либо фильтра или прогноза.
Пытаясь создать общую абстракцию, вы скрываете критическую информацию о том, что на самом деле может поддерживать служба, и позволяете потребителям делать предположения, которые они не будут знать, недействительными, пока не станет слишком поздно. Вы создали сценарий, который позволяет коду ломаться неожиданным и даже непредсказуемым образом.
Основная проблема с вашей концепцией заключается в том, что веб-службы предназначены для инкапсуляции бизнес-логики или логики приложения, а не источников данных . Создание тонкого шпона поверх DAL не добавляет реальной ценности к общему решению, это просто еще один уровень косвенности, с которым клиенты будут вынуждены иметь дело. Веб-сервисы хороши, но они значительно увеличивают затраты на разработку и обслуживание, потому что каждое обновление схемы / данных должно происходить в двух местах, а не в одном. Добавление 3-го (или 4-го, или 5-го) уровня к приложению обычно целесообразно, только если этот уровень обеспечивает некоторый дополнительный интеллект или, по крайней мере, инкапсуляция . Архитектуры сервисов, построенные исключительно на операциях доступа к данным, представляют собой «неприятный запах архитектуры», поскольку они просто воссоздают базу данных со строго ограниченными функциями.
Например, сервис-ориентированный или ориентированный на сообщения запрос на «Заказы», вероятно, позволит потребителю указать любого или всех клиентов, диапазон дат и ряд других критериев, специфичных для домена - типы продуктов, количества, общая стоимость, способ оплаты и тд. Вы хотели бы объединить все это в одну Сервисную операцию; потребитель отправляет одно сообщение , в котором подробно указывается, чего он хочет, и вы предоставляете его соответствующим образом. Конечно, подобный запрос для «Клиентов» не будет иметь ни одного из этих критериев; вместо этого вы можете возвращать результаты на основе даты регистрации, географического положения, кредитного рейтинга и т. д. Каждый запрос будет в этом смысле совершенно уникальным; вы предоставляете услугу потребителям, чтобы предоставить им гибкость, которую редко предоставляет простой уровень CRUD. Вы могли бы сделать это для того, чтобы иметь возможность выставлять его различным потребителям с различными потребностями без необходимости постоянно менять договор на обслуживание . Предложенная вами архитектура не подходит для этой конечной цели.
Возможно, это просто моё мнение, и другим людям есть, что сказать по этому поводу; все, что я могу добавить, это то, что я основываю эти утверждения на личном опыте работы с веб-службами (с которым я работаю ежедневно), а не на общепринятой мудрости, хотя я считаю, что общепринятая мудрость согласна со мной здесь.