2010-08-11 2 views
3

У меня есть объект, который я создаю из ответа веб-сервиса. Если я получу список этих объектов, у них будет минимальный объем информации (в приведенном ниже примере идентификаторы, Prop1 и Prop2 возвращаются в ответе списка). Если я получу объект по ID, возвращается полный набор информации, включая дочерние объекты в Prop3 и Prop4.Вручную установить значение Lazy <T>

public class Foo 
{ 
    public Guid ID { get; set; } 
    public string Prop1 { get; set; } 
    public string Prop2 { get; set; } 

    public Lazy<IEnumerable<Bar>> Prop3 { get; } 
    public Lazy<IEnumerable<Bar2>> Prop4 { get; } 
} 

То, что я хочу быть в состоянии сделать, это использовать этот объект, когда частично построен, но если Prop3 или Prop4 доступны, сделать вызов на веб-сервиса, чтобы загрузить более детальные данные и заполнить как Prop3 и Prop4 ,

Если я использую Lazy, то я могу заполнить каждую собственность отдельно, обратившись к ней. Это приведет к идентичным вызовам webservice, чтобы каждый раз анализировать малую часть ответа. То, что я хочу быть в состоянии сделать, это создать каждый ленивое это:

Prop3 = new Lazy<IEnumerable<Foo>>(() => LoadDetailedInformation()); 

private void LoadDetailedInformation() 
{ 
    // Get info from web service 
    Prop3.Value = ParseProp3(response); 
    Prop4.Value = ParseProp4(response); 
} 

Так что в этом делать вид реализации ленивого, функция будет вызываться, когда ленивый объект доступен, но не на самом деле возвращают данные , Он будет выполнять некоторые вычисления и инициализировать все ленивые значения сразу.

Мне лучше просто сворачивать свой собственный «ленивый», или есть ли другой способ сделать это, не набирая тонны кода обертки для каждого свойства? Один из классов, для которого я делаю это, содержит около 20 объектов, которые должны быть обернуты таким образом, чтобы я не хотел писать фактические геттеры и сеттеры, если мне это удастся.

ответ

2

Это звучит, как вы хотите одногоLazy<T>, который создает соединение объекта с как значения в Tuple<Bar, Bar2> воли к работе:.

public Bar Prop3 { get { return lazy.Value.Item1; } } 
public Bar2 Prop4 { get { return lazy.Value.Item2; } } 

private readonly Lazy<Tuple<Bar, Bar2>> lazy = 
    new Lazy<Tuple<Bar, Bar2>>(LoadDetailedInformation); 

private Tuple<Bar, Bar2> LoadDetailedInformation() 
{ 
    ... 
} 

Конечно, вместо Tuple вы могли бы a DetailedResponse тип - я бы рекомендовал, чтобы вы получили более нескольких свойств. Эффективно вы хотите лениво получить подробный ответ, а затем предоставить упрощенный доступ к отдельным свойствам внутри него.

1

Ленивый только получает то, что вы просите, поэтому попросите их вместе ...

public class Foo 
{ 
    public Guid ID { get; set; } 
    public string Prop1 { get; set; } 
    public string Prop2 { get; set; } 
    public Lazy<SubFoo> SubFoo{ get; } 
} 

public class SubFoo 
{ 
    public IEnumerable<Bar> Prop3 { get; } 
    public IEnumerable<Bar2> Prop4 { get; } 
} 
Смежные вопросы