c # выполнение строки как кода ... стоит ли усилий? - PullRequest
5 голосов
/ 30 марта 2011

Вот история на данный момент:

Я делаю приложение на C # winforms, чтобы упростить указание оборудования для предложений по прокату.

В нем у меня есть List<T> из ~ 1500 акцийitems.

Эти элементы имеют свойство AutospecQty, которое имеет метод доступа get, который должен выполнять некоторый код, специфичный для каждого элемента.Этот код будет ссылаться на различные другие элементы в списке.

Так, например, один элемент (назовем его Item0001) имеет этот аксессор get, который может нуждаться в выполнении некоторого кода, который может что-то выглядетькак это:

[some code to get the following items from the list here]

if(Item0002.Value + Item0003.Value > Item0004.Value)
{ return Item0002.Value }
else
{ return Item0004.Value }

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

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

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

Итак, вопросы:

  1. Есть ли более простой / простой способ достижения того, что я пытаюсь сделать?
  2. Если1 = false (я полагаю, что это так), стоит ли усилий всех потенциальных проблем этого подхода или лучше потратить мое время на написание функции автоматического обновления в приложении иХранить все это внутри основного приложения (чтобы пользователю просто нужно было обновлять само приложение раз в неделю)?
  3. Еще одна (вероятно, плохая) идея, с которой я столкнулся, перенес весь код автоспуска в отдельноеDLL, или либо просто переустанавливать ее, когда это необходимо, либо возможно даже ссылаться на одну DLL на общем сетевом диске?

Я думаю, это довольно опасная территория, куда бы я ни пошел.Может кто-нибудь сказать мне, открываю ли я банку с червями, которую лучше оставить хорошо и по-настоящему закрытой?

Есть ли лучший способ сделать все это?У меня есть привычка усложнять вещи, которые я пытаюсь отбросить: P

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

Извините, если я плохо это объяснил.

Заранее спасибо

Ответы [ 5 ]

1 голос
/ 30 марта 2011

Некоторые варианты для рассмотрения:

1) Если бы у вас была хорошая система непрерывной интеграции с автоматическим построением и развертыванием, было бы проблемой развертывания каждую неделю?

2) Рассматривали ли вы MEF или аналогичный, который позволил бы вам заменить только одну DLL, содержащую новые правила?

3) Если формула может быть выражена просто (без необходимости вычисления некоторого кода, например, A + B + C + D> E + F + G + H => J или K), вы можете использовать отражение для собрать значения параметров и затем применить их.

4) Вы можете использовать выражения в .NET 4 и построить дерево выражений из базы данных, а затем оценить его.

1 голос
/ 30 марта 2011

Рассматривали ли вы что-то вроде MEF, тогда у вас могло бы быть много небольших библиотек, реализующих различные версии ваших вычислений и просто указывающих, какую из них загрузить из базы данных.

Это предполагает, что вы можете обернуть их всев одном (или небольшом количестве) интерфейсов.

1 голос
/ 30 марта 2011

Я бы напал на эту проблему, создав домен-специфичный язык, который программа могла бы интерпретировать для выполнения правил.Затем поместите фрагменты кода DSL в базу данных.

Как видите, я также люблю усложнять вещи.:-) Но это работает до тех пор, пока долгосрочное использование упрощено.

1 голос
/ 30 марта 2011

Похоже, что вы хорошо справляетесь с реализацией шаблона спецификации .

Как описывает его Википедия:

, благодаря чему бизнес-логика может быть рекомбинирована цепочкойбизнес-логика вместе, используя булеву логику.

0 голосов
/ 30 марта 2011

Вы можете заставить вашу программу компилировать ваши правила во время выполнения в класс, который действует как плагин, используя CSharpCodeProvider.

См. Компиляция кода во время выполнения для примера того, как это сделать.

...