Код удаленного выполнения - лямбда-выражения ... статические методы ... и т. Д. eval () для C #?

2

Итак, вот концепция. Я пытаюсь написать бэкэнд С# для CouchDB (продолжайте читать, это мало или ничего общего с CouchDB).

Вот основная идея:

1) Драйвер DB загружает произвольную строку на сервер БД.

2) Драйвер DB сообщает серверу БД для запуска кода и создания представления

3) Сервер БД загружает мой сервер С#, передает ему строку ввода

4) Сервер базы данных передает эту функцию на сервер С#

5) Сервер БД передает данные базового сервера С# для выполнения функции через

6) С# Backend выполняет код и возвращает данные на сервер БД

7) Сервер БД хранит или иным образом сортирует и отправляет результаты обратно в драйвер DB.

Таким образом, проблема, с которой я столкнулась, - это выполнение удаленного кода. Все мои модели - объекты С#. Поэтому было бы очень хорошо, если бы вы могли написать код на передней панели, а код был переведен на задний план для выполнения. Не нужно копировать DLL и т.д. Теперь в CouchDB этот язык запросов является JavaScript, поэтому просто просто скопировать код в строку.

Любые варианты, подобные этому в С#? Могу ли я получить строчную версию функции? Должен ли я создать внешний сервер, на котором размещаются эти сборки DLL, и обслуживает их до бэкэндов CouchDB? Должен ли я скомпилировать их на передней панели и вставлять файлы .cs в качестве ресурса? На данный момент я просто мозговой штурм. Любые мысли/идеи/вопросы приветствуются.

Теги:
rpc

4 ответа

0
Лучший ответ

Вы могли бы достичь этого, используя деревья выражений (System.Linq.Expressions)?

Возможно, некоторые способы передачи сериализованного дерева выражений на задний конец, скомпилировав это в lambda/Func < > на стороне сервера и затем выполнив его?

Не играли с ними, кроме исследования любопытства, когда Linq был представлен, но он может помочь.

  • 0
    Это может работать лучше ... посмотрим.
0

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

Если последнее (это то, что вы должны делать), позволяя произвольному выполнению динамического кода, не только нарушает модель разработки .NET(на мой взгляд - без пламени), это огромный риск для безопасности), вы можете использовать веб-службу.

Веб-сервисы и службы WCF - отличный способ распространения обработки между машинами.

0

Вот несколько проектов, которые я использовал в прошлом, которые могли бы помочь вам:

Vici Parser

Vici Parser - это библиотека .NET для синтаксический анализ с поздними ограничениями и рендеринг шаблонов. Он также включает простой в использовании токенизатор, который может быть используется для разбора всех видов файлов форматы (полнофункциональный анализатор JSON включен).

Эта статья Codeproject

В этом примере показана функция "Eval" для С# и реализует различные способы использования этой функции оценки. Библиотека написано на С# и может быть протестировано с MainForm в решении.

Другие альтернативы включают использование скриптов XSLT (что-то Umbraco CMS использует) и, возможно, что-то вроде LUA.NET, который позволит вам создавать песочницу, что может сделать код.

0

Похоже, что вы ищете метод eval для Javascript для С#. К сожалению, это не существует сегодня и не является тривиальным для реализации. Два основных подхода к динамическому выполнению кода С#:

  • Создание легких методов с помощью Reflection.Emit
  • Компиляция сборок "на лету" (через CodeDom или прямые вызовы csc).

Еще один вариант рассмотрения здесь - воспользоваться динамическим языком. Начиная с С# 4.0, он очень легко взаимодействует с динамическими языками. Вместо того, чтобы бэкэнда передавали код С#, почему бы не передать Python или Ruby и воспользоваться DLR?

  • 0
    Одна из моих главных причин отойти от обычного CouchDB-компонента JavaScript - мое общее отвращение к динамическим языкам. DLR - интересный вариант, но тогда я в основном возвращаюсь к тому же, чтобы не ловить ошибки во время компиляции.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню