Как динамически генерировать бизнес-сервисы подключения - PullRequest
4 голосов
/ 03 февраля 2012

Мы пытаемся развернуть решение модели Business Connectivity Services (BCS), в котором свойства модели зависят от структуры данных, предоставляемых веб-службой.

В идеале модель BCS должна представлять коллекциюпар ключ / значение, которые затем преобразуются в столбцы в списке sharepoint, поскольку это будет означать, что одну и ту же модель можно использовать для нескольких разных наборов данных, однако из того, что мы можем сказать, это не то, как модели BCS были разработаны, так как ониполагаться на модель, которая будет строго типизирована для отражения импортируемой сущности.

В нашем нынешнем виде мы ищем решение, которое позволяет пользователю «создать» новый внешний список, предоставляя URL-адрес для удаленного набора данных через пользовательскую страницу в центральном администраторе sharepoint, который затем автоматически создастпроект модели BCS (путем изменения шаблона проекта), а затем компилирование и выпуск результирующей функции на лету.

Таким образом, мы можем создать «фиксированный» класс со свойствами, которые представляют структуру импортируемых данных.

например, источник данных A может предоставить

<cars>
<car>
<color>blue</color>
<make>ford</make>
</car>
<car>
<color>red</color>
<make>lotus</make>
</car>
</cars>

в этом случае нам нужна Модель BCS для «автомобиля», которая имеет два общедоступных свойства: color и make, однако источник данных B может предоставить

<invoices>
<invoice>
<amount>£34.00</amount>
</invoice>
<invoice>
<amount>£34.00</amount>
</invoice>
</invoices>

, и в этом случае нам нужен «счет» модели BCS с одним открытымсобственность на сумму.

Буду признателен всем за отзывы об этом подходе или способе «наилучшей практики» для достижения этого.

1 Ответ

1 голос
/ 12 февраля 2012

[У меня был опыт создания чего-то подобного в .Net - я не уверен, насколько это важно для вас.]

Мне пришлось написать инструмент импорта, который мог бы обрабатывать файлы любого формата.Чтобы справиться с этим должным образом, я написал небольшой класс, который будет принимать определение формата xml (имя, тип данных, строка формата, пользовательский анализатор и т. Д.) И генерировать класс, который может читать файл и отображать IQueryable<FileFormat> и некоторыедополнительные метаданные.

Стоит отметить, что, чтобы сделать его полностью гибким, я должен был разрешить определению формата предоставлять лямбда C # / VB, которая будет компилироваться и выполняться (например, когда формат даты ввода нестандартный и нужен нестандартный парсер).Это явно риск для безопасности - поэтому, когда я создал экземпляр динамического класса, я сделал это в отдельном домене приложений с очень небольшим количеством привилегий.Это может не применяться в вашей ситуации.

Мы использовали специальный шаблонизатор для генерации кода, который затем был скомпилирован с использованием пространства имен System.Codedom.Compiler - Это позволило нам создавать сборки икэшируйте их, пока не изменилось определение.Возможно, стоит рассмотреть шаблонизатор Razor, если вы делаете что-то подобное.

Единственные реальные проблемы, которые у нас возникли, были связаны с кодированием неизвестного типа данных.Сделав так, чтобы пользовательский класс реализовал наш собственный интерфейс IImportFile, который предоставлял метаданные стандартным способом (фактически, ту же информацию, что и в спецификации xml), мы могли обойти его без особых усилий.

Нам повезлов том смысле, что это инструмент для доверенных пользователей (по крайней мере, только доверенные пользователи могут предоставить новую спецификацию формата файла), поэтому риски безопасности были ограничены.Если вы компилируете код, основанный на пользовательском вводе, убедитесь, что у вас есть адекватные меры безопасности.

...