Итак, вот концепция. Я пытаюсь написать бэкэнд С# для CouchDB (продолжайте читать, это мало или ничего общего с CouchDB).
Вот основная идея:
1) Драйвер DB загружает произвольную строку на сервер БД.
2) Драйвер DB сообщает серверу БД для запуска кода и создания представления
3) Сервер БД загружает мой сервер С#, передает ему строку ввода
4) Сервер базы данных передает эту функцию на сервер С#
5) Сервер БД передает данные базового сервера С# для выполнения функции через
6) С# Backend выполняет код и возвращает данные на сервер БД
7) Сервер БД хранит или иным образом сортирует и отправляет результаты обратно в драйвер DB.
Таким образом, проблема, с которой я столкнулась, - это выполнение удаленного кода. Все мои модели - объекты С#. Поэтому было бы очень хорошо, если бы вы могли написать код на передней панели, а код был переведен на задний план для выполнения. Не нужно копировать DLL и т.д. Теперь в CouchDB этот язык запросов является JavaScript, поэтому просто просто скопировать код в строку.
Любые варианты, подобные этому в С#? Могу ли я получить строчную версию функции? Должен ли я создать внешний сервер, на котором размещаются эти сборки DLL, и обслуживает их до бэкэндов CouchDB? Должен ли я скомпилировать их на передней панели и вставлять файлы .cs в качестве ресурса? На данный момент я просто мозговой штурм. Любые мысли/идеи/вопросы приветствуются.
Вы могли бы достичь этого, используя деревья выражений (System.Linq.Expressions)?
Возможно, некоторые способы передачи сериализованного дерева выражений на задний конец, скомпилировав это в lambda/Func < > на стороне сервера и затем выполнив его?
Не играли с ними, кроме исследования любопытства, когда Linq был представлен, но он может помочь.
Определите функцию. Является ли этот произвольный код (который должен быть динамически скомпилирован и выполнен) или список методов, которые могут быть присоединены к классу?
Если последнее (это то, что вы должны делать), позволяя произвольному выполнению динамического кода, не только нарушает модель разработки .NET(на мой взгляд - без пламени), это огромный риск для безопасности), вы можете использовать веб-службу.
Веб-сервисы и службы WCF - отличный способ распространения обработки между машинами.
Вот несколько проектов, которые я использовал в прошлом, которые могли бы помочь вам:
Vici Parser - это библиотека .NET для синтаксический анализ с поздними ограничениями и рендеринг шаблонов. Он также включает простой в использовании токенизатор, который может быть используется для разбора всех видов файлов форматы (полнофункциональный анализатор JSON включен).
В этом примере показана функция "Eval" для С# и реализует различные способы использования этой функции оценки. Библиотека написано на С# и может быть протестировано с MainForm в решении.
Другие альтернативы включают использование скриптов XSLT (что-то Umbraco CMS использует) и, возможно, что-то вроде LUA.NET, который позволит вам создавать песочницу, что может сделать код.
Похоже, что вы ищете метод eval для Javascript для С#. К сожалению, это не существует сегодня и не является тривиальным для реализации. Два основных подхода к динамическому выполнению кода С#:
Еще один вариант рассмотрения здесь - воспользоваться динамическим языком. Начиная с С# 4.0, он очень легко взаимодействует с динамическими языками. Вместо того, чтобы бэкэнда передавали код С#, почему бы не передать Python или Ruby и воспользоваться DLR?