Я точно не знаю, как описать этот вопрос, но здесь. У меня есть иерархия классов объектов, которые отображаются в базе данных SQLite. У меня уже есть нетривиальный код, который связывается между объектами .NET и базой данных.Инициализация конструктора из хранимого кеша в C#
У меня есть базовый интерфейс следующим образом:
public interface IBackendObject
{
void Read(int id);
void Refresh();
void Save();
void Delete();
}
Это основные операции CRUD на любом объекте. Затем я реализовал базовый класс, который инкапсулирует большую часть функциональности.
public abstract class ABackendObject : IBackendObject
{
protected ABackendObject() { } // constructor used to instantiate new objects
protected ABackendObject(int id) { Read(id); } // constructor used to load object
public void Read(int id) { ... } // implemented here is the DB code
}
Теперь, наконец, у меня есть свои конкретные дочерние объекты, каждый из которых имеет свои собственные таблицы в базе данных:
public class ChildObject : ABackendObject
{
public ChildObject() : base() { }
public ChildObject(int id) : base(id) { }
}
Это прекрасно работает для всех моих целей до сих пор. У ребенка есть несколько методов обратного вызова, которые используются базовым классом для правильного создания данных.
Теперь я хочу сделать это немного эффективным. Например, в следующем коде:
public void SomeFunction1()
{
ChildObject obj = new ChildObject(1);
obj.Property1 = "blah!";
obj.Save();
}
public void SomeFunction2()
{
ChildObject obj = new ChildObject(1);
obj.Property2 = "blah!";
obj.Save();
}
В этом случае, я буду строить две совершенно новую инстанциацию памяти и в зависимости от порядка SomeFunction1 и SomeFunction2 называют, либо property1 или свойство2 не может быть сохранен. То, что я хочу достичь, - это способ для обоих этих экземпляров как-то указывать на одно и то же место памяти - я не думаю, что это будет возможно, если я использую «новое» ключевое слово, поэтому я искал намеки относительно как действовать.
В идеале я хотел бы хранить кеш всех загруженных объектов в классе ABackendObject
и возвращать ссылки на уже загруженные объекты по запросу или загружать объект из памяти, если он еще не существует, и добавить его к кешу. У меня есть много кода, который уже использует эту структуру, поэтому мне, конечно, придется изменить много вещей, чтобы заставить это работать, но я просто хотел получить несколько советов о том, как действовать.
Спасибо!
Я не совсем понимаю, в чем проблема. Если вы вызываете Save() сразу после каждого изменения свойства, то это немедленно возвращает это изменение в базу данных? Если это так, не будет ли новое значение в следующий раз при создании нового объекта ChildObject? – tlayton
Я не называю Save() после каждого изменения свойства, так как объекты могут быть частью длительных процессов. Кроме того, основная проблема заключается в том, что объекты могут создаваться в нескольких разных областях (поскольку мои объекты имеют ассоциации и могут быть связаны друг с другом). В этом случае мне приходилось ударять диск каждый раз, когда я загружаю объект, что было бы еще одним хитом производительности. – sohum