在C#中从存储的缓存初始化构造函数

soh*_*hum 1 c# inheritance memory-management object instantiation

我不确定如何描述这个问题,但是这里有.我有一个在SQLite数据库中映射的对象的类层次结构.我已经编写了所有在.NET对象和数据库之间进行通信的非平凡代码.

我有一个基本界面如下:

public interface IBackendObject
{
    void Read(int id);
    void Refresh();
    void Save();
    void Delete();
}
Run Code Online (Sandbox Code Playgroud)

这是任何对象的基本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
}
Run Code Online (Sandbox Code Playgroud)

现在,最后,我有了具体的子对象,每个对象在数据库中都有自己的表:

public class ChildObject : ABackendObject
{
    public ChildObject() : base() { }
    public ChildObject(int id) : base(id) { }
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,这适用于我的所有目的.子进程有几个回调方法,基类使用这些方法来正确实例化数据.

我现在想要提高效率.例如,在以下代码中:

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();
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我将构建两个全新的内存实例化,并且根据被调用的SomeFunction1和SomeFunction2的顺序,可能无法保存Property1或Property2.我想要实现的是这两种实例化以某种方式指向相同内存位置的方式 - 如果我使用"new"关键字,我认为这不可能,所以我一直在寻找提示如何进行.

理想情况下,我想在我的ABackendObject类中存储所有已加载对象的缓存,并在请求时返回对已加载对象的内存引用,或者如果对象尚未存在则从内存加载该对象并将其添加到缓存中.我已经有很多代码已经在使用这个框架了,所以我当然要改变很多东西来实现这个功能,但我只是想知道如何继续.

谢谢!

Ree*_*sey 6

如果要存储已加载对象的"缓存",则可以轻松地让每个类型维护一个Dictionary<int, IBackendObject>包含加载对象的类型,并按其ID键入.

而不是使用构造函数,构建一个检查缓存的工厂方法:

public abstract class ABackendObject<T> where T : class
{
     public T LoadFromDB(int id) {
         T obj = this.CheckCache(id);
         if (obj == null)
         { 
             obj = this.Read(id); // Load the object
             this.SaveToCache(id, obj);
         }
         return obj;
     }
} 
Run Code Online (Sandbox Code Playgroud)

如果您使基类具有通用性,并且读取虚拟,则应该能够提供大部分此功能而无需重复代码.