#c# #fluent-nhibernate
#c# #свободно владеет-nhibernate
Вопрос:
У меня есть некоторая функциональность, которую необходимо «выбирать» в качестве опции для определенных объектов в моей базе данных, но фактический код, лежащий в основе каждого метода, слишком сложен, чтобы его можно было сериализовать в базу данных. Они также не могут быть хранимыми процедурами SQL.
Итак, в принципе, у меня есть статическая List<T>
часть этих функций. Существует ли стандартный способ связать их с объектами в моей базе данных? Например..
var functions = new static List<Omega>{
new Omega {
Id = 1, // this would be useful to a database, but nothing really sets it.
Name = "Some Name", // this isn't useful. It's a string literal
Function = // this may be a Method, or a Lambda Expression, or something else.
}
};
class Psi {
Guid Id { get; set; }
Omega Omega { get; set; } // how can I keep a hard-reference here?
}
Комментарии:
1. Итак, проблема в том, как сохранить ссылку Omega из экземпляра Psi в базу данных?
2. ДА.
Omega
Это далеко, далеко, далеко, слишком сложно для сериализации. Но он все еще должен существовать и на него можно ссылаться. Я бы хотел избежать использования «волшебных строк», если это возможно.3. И все экземпляры Omega хранятся в коллекции? Является ли эта коллекция глобальной для приложения или связана с конкретным экземпляром Psi? Может ли Omega функционировать с любыми параметрами. Если да, то как вызывается делегат?
4. Они хранятся в коллекции. То, как они принимают параметры, не имеет значения. Принимаемые ими параметры могут быть сериализованы.
Ответ №1:
Хорошо, я не уверен, правильно ли я понял. Делегаты сериализуемы и, следовательно, их можно сохранить в базе данных, например, используя NH. Есть некоторые ограничения, но сериализация делегатов в любом случае — это авантюрное путешествие :).
Если это неэффективный способ, то вы могли бы попытаться реализовать все свои «функции» как статические методы. Имя класса и метода может быть сохранено в столбце таблицы и вызвано с помощью отражения.
Комментарии:
1. Мне трудно понять, как это будет работать. Я не совсем уверен, как обернуть вызов метода в делегат, который можно сериализовать.
2. Это действительно здорово, и это очень полезно для некоторых вещей, но на самом деле это не решает мою проблему, потому что рассматриваемые данные слишком сложны, чтобы быть простым сериализуемым делегатом.
3. Если вы работаете со сложным состоянием в «Функции» вашего Omega, а «Функция» представляет собой сложный алгоритм, то, возможно, что-то вроде Workflow Foundation — это верный способ для вас. Этот фреймворк предназначен для решения таких задач. В любом случае, мне любопытно, чего вы пытаетесь достичь :).
4. эх, рабочий процесс Windows немного излишен, и у меня нет времени изучать его для этого. Проблема не в выполнении того, что мне нужно, а в сохранении этого в базе данных.
5. Что касается того, чего я пытаюсь достичь … по сути, представьте анонимные методы как выбираемые функции для клиента. Это довольно сложно объяснить, не видя всего объема проекта.