Хранение базы данных динамических методов в C # - PullRequest
2 голосов
/ 12 августа 2010

Как я могу хранить методы C # в экземпляре сервера SQL, который будет загружен и динамически (во время выполнения) позднее?

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

Я кратко рассмотрел Reflection.Emit DynamicMethod, но он не сериализуем.

Будем благодарны за любые предложения или альтернативные маршруты.

Ответы [ 2 ]

0 голосов
/ 13 августа 2010

Из интереса, если вы используете деревья Expression <> для своих методов, на ходу есть проект для их сериализации - см. Сообщение SO здесь

0 голосов
/ 12 августа 2010

Сериализация классов не выполняет сериализацию какого-либо кода, она просто сериализует данные и перезагружает эти данные в свойства класса, когда он десериализуется.Любые методы в классе такие же, как если бы вы только что создали экземпляр класса вручную.Попытка сериализации реального кода в базу данных, а затем каким-то образом скомпилировать его в метод во время выполнения - довольно странная и экзотическая вещь, и я изо всех сил пытаюсь понять, как она будет полезна в контексте тестирования.Если вы действительно хотите сохранить исходный код в базе данных, лучше сохранить его в виде текста, восстановить его в текстовый файл, а затем программно скомпилировать.Однако это то, для чего предназначены системы управления версиями и сборки, такие как Subversion и Nant, так что вы, возможно, будете изобретать велосипед заново.

В дополнение к вашему последнему комментарию, я думаю, что хорошим примером того, что вам нужно, будет Внедрение зависимости .Вы создаете интерфейс (например, ITester), который определяет контракт для теста, простой из которых - это метод теста, который возвращает bool для прохождения и неудачи.Вы пишете свою тестовую программу как обычно, но ваш тестовый метод использует класс, который реализует интерфейс ITest.Класс, который реализует интерфейс ITester, отвечает за конкретную реализацию теста и фактически выполняет тест.Остальная часть системы не заботится о том, что такое тест или как он проводится, она просто запускает метод теста, который возвращает true или false.

Таким образом, все, что вам нужно сделать, чтобы создать новую реализацию тестаэто создать новый класс, который реализует ITester.Если вам нужно изменить реализацию теста, вы просто измените конкретный класс и повторно развернете его.Если вы скомпилируете каждый класс тестера в свою собственную DLL, вы можете сохранить их в виде двоичных данных в базе данных.Затем вы можете извлечь их из базы данных и загрузить их динамически, используя System.Reflection.Assembly.Load.Обратите внимание, что это не сериализация, вы храните двоичный файл сборки в базе данных.

В результате вы получаете систему, которая решает, какой тест необходимо выполнить, запрашивает базу данных для соответствующего файла DLL, которыйможет запустить тестовый код, затем динамически загружать и выполнять DLL во время выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...