может ли служба wcf быть слабо разделена

Начнем с того, что я новичок в мире WCF, так что простите меня, если это звучит наивно.

Насколько я понимаю, в отличие от веб-сайтов на основе ASP.NET, которые используют ADO.NET для связи с базой данных, приложению на основе Silverlight всегда требуются службы WCF или RIA для связи с БД. Мы знаем, что веб-сайты ASP.NET не тесно связаны с моделью базы данных, поэтому можно запускать любую сохраненную процедуру с помощью ADO.NET и просматривать результаты в сетке, не зная ничего о результирующей объектной модели.

Однако в службе WCF или RIA она всегда должна быть синхронизирована с моделью сущности базы данных и не может запускать хранимую процедуру без ее шаблона результата в службе. Таким образом, Silverlight каким-то образом заставляет нас быть тесно связанными с моделью базы данных.

Есть ли способ просмотреть результаты сохраненной процедуры в сетке независимо от того, сколько раз процедура была изменена в бэкэнде?


person Hari    schedule 19.10.2010    source источник


Ответы (1)


Однако в службе WCF или RIA она всегда должна быть синхронизирована с моделью сущности базы данных и не может запускать хранимую процедуру без ее шаблона результата в службе. Таким образом, Silverlight каким-то образом заставляет нас быть тесно связанными с моделью базы данных.

Бзззт !!! Неправильный ответ!!

Службы WCF совсем не обязательно должны быть тесно связаны с базой данных. Фактически, с помощью службы WCF вы все еще можете реализовать многоуровневый подход:

WCF end point -> calls through to business layer -> calls DAL -> calls database

Преимущество службы WCF заключается в том, что ее можно использовать для предоставления доступа к вашему бизнес-уровню множеству отключенных слабосвязанных клиентов (или потребителей - они не обязательно должны быть клиентами пользовательского интерфейса). Все, что отображается, выполняется как интерфейс - служба WCF представляет контракт, выполнение которого гарантирует. Объекты данных, возвращаемые через этот интерфейс, могут быть любыми, что мне нравится (при условии, что они могут быть сериализованы через границу WCF). Это не обязательно должен быть DataTable или объекты данных, которые отражают структуру моей базы данных.

Я не могу комментировать сервисы RIA, потому что я с ними не играл. Насколько я понимаю, это просто службы WCF с множеством вещей, созданных для вас для удобства, что означает, что они могут очень напоминать структуру вашей базы данных. Чтобы решить эту проблему, просто потратите немного больше времени и создайте свои собственные службы WCF. Другие респонденты, возможно, смогут подробнее рассказать об этом :)

Изменить: похоже, что настоящая проблема в том, что ваш механизм извлечения данных тесно связан. Существует несколько способов решить эту проблему, чтобы изолировать влияние внесения изменений (обратите внимание, что это не исчерпывающий список):

  • убедитесь, что ваши вызовы WCF возвращают типизированные объекты - даже при тесной связи с базой данных объект type остается неизменным, даже если его внутренняя часть может измениться (т.е. если вы добавите другое свойство), поэтому вам не следует требовать изменить интерфейс WCF при добавлении еще одного столбца в таблицу базы данных

  • создайте отдельную сборку, которая реализует извлечение ваших данных из базы данных. Он становится вашим DAL (D ata A ccess L ayer), помещает туда свой LinqToSql, это сохраняет его отдельно от сборки, которая реализует конечные точки WCF

  • преобразовать ваши данные, которые возвращаются из базы данных, в более общие и независимые легковесные объекты данных до того, как они пройдут через границу WCF (объекты передачи данных - DTO)

  • используйте инструмент генерации кода (их много) для генерации ваших интерфейсов WCF на основе определений ваших объектов данных

person slugster    schedule 19.10.2010
comment
Да, я понял, что WCF представляет собой контракт, а объекты данных сериализуются для использования клиентом. В моем приложении у меня есть классы linq sql, которые вызывают сохраненный процесс, а IResult автоматически создается дизайнером. Это работает до тех пор, пока сохраненная процедура не изменилась, но как только я добавлю или удалю столбец из результата, мне также придется обновить службу. Я хотел знать, могу ли я делать общие вызовы базы данных, просто предоставляя сохраненное имя процесса вместе с параметрами (например, как в ADO.NET с использованием SqlCommand, CommandType = sp и SqlReader) - person Hari; 20.10.2010
comment
В WCF нет ничего, что мешало бы вам использовать обычный ADO.NET для уровня вашей базы данных. Вы бы просто использовали POCO (простые старые объекты CLR), которые вы кодируете вручную, а не классы, которые L2S или EF генерирует для вас. - person Ken Smith; 20.10.2010