Ленивая инициализация для доступа к данным - PullRequest
0 голосов
/ 09 октября 2010

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

PopulateAobjs();
PopulateBobjs();
PopulateCobjs();
...

После заполнения значений я сохраняю сущности в Dictionary<Id, Entity>.

Я бы хотел сделать этот процесс ленивым, чтобы, если мне не нужны C объекты, мне не нужно вызывать этот метод. и т.д.

Как это можно сделать?

LazyInit <>

Ответы [ 2 ]

2 голосов
/ 09 октября 2010

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

private Lazy<IEnumerable<CObject>> cObjects = new Lazy<IEnumerable<CObject>>(LoadCObjects);

public IEnumerable<CObject> CObjects
{
    get { return this.cObjects.Value; }
}

CObjects будет загружен при первом обращении к свойству.

РЕДАКТИРОВАТЬ: Когда вы не в .NET 4.0, Lazy<T> это просто модный способ для чего-то подобного:

private IEnumerable<CObject> cObjects;

public IEnumerable<CObject> CObjects
{
    get
    {
        if (this.cObjects == null)
            lock (this.someLockObject)
                if (this.cObjects == null)
                    this.cObjects = this.LoadCObjects();

        return this.cObjects;
    }
}
0 голосов
/ 09 октября 2010

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

Property FooCustomers
    Get
       If _Customers IS NULL THEN Then _Customers = CustomerCache.FindByKey(companyKeys)
        Return _Customers
...