Je ne sais pas exactement comment décrire cette question, mais voilà. J'ai une hiérarchie de classe d'objets qui sont mappés dans une base de données SQLite. J'ai déjà écrit tout le code non-trivial qui communique entre les objets .NET et la base de données.Initialisation du constructeur à partir du cache stocké en C#
J'ai une interface de base comme suit:
public interface IBackendObject
{
void Read(int id);
void Refresh();
void Save();
void Delete();
}
Ce sont les opérations CRUD de base sur tout objet. J'ai ensuite implémenté une classe de base qui encapsule la plupart des fonctionnalités.
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
}
Maintenant, enfin, j'ai mes objets enfants en béton, dont chacun ont leurs propres tables dans la base de données:
public class ChildObject : ABackendObject
{
public ChildObject() : base() { }
public ChildObject(int id) : base(id) { }
}
Cela fonctionne bien pour tous mes objectifs jusqu'à présent. L'enfant dispose de plusieurs méthodes de rappel utilisées par la classe de base pour instancier correctement les données.
Je veux maintenant rendre cela un peu efficace. Par exemple, dans le code suivant:
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();
}
Dans ce cas, je serai construire deux instanciations de mémoire complètement nouveaux et en fonction de l'ordre de SomeFunction1 et SomeFunction2 appelés, soit Propriété1 ou Propriété2 ne peuvent pas être sauvés. Ce que je veux réaliser est un moyen pour ces deux instanciations de pointer d'une manière ou d'une autre vers le même emplacement de mémoire - je ne pense pas que ce sera possible si j'utilise le "nouveau" mot-clé, donc je cherchais des indices la façon de procéder. Idéalement, je voudrais stocker un cache de tous les objets chargés dans ma classe ABackendObject
et renvoyer des références de mémoire aux objets déjà chargés lorsque demandé, ou charger l'objet de la mémoire si elle n'existe pas déjà et l'ajouter à la cache. J'ai beaucoup de code qui utilise déjà ce framework, donc je vais bien sûr devoir changer beaucoup de choses pour que cela fonctionne, mais je voulais juste quelques conseils sur la façon de procéder.
Merci!
Je ne comprends pas très bien le problème. Si vous appelez Save() juste après chaque fois que vous modifiez une propriété, est-ce que cela replace immédiatement cette modification dans la base de données? Si oui, la nouvelle valeur ne sera-t-elle pas la prochaine fois que vous créerez un nouveau ChildObject? – tlayton
Je n'appelle pas Save() après chaque modification de propriété car les objets peuvent faire partie de processus de longue durée. En outre, le problème sous-jacent est que les objets peuvent être créés dans plusieurs portées différentes (puisque mes objets ont des associations et peuvent être liés les uns aux autres). Dans ce cas, je devrais frapper le disque chaque fois que je charge un objet, ce qui serait un autre coup de performance. – sohum