如果已设置属性,如何防止调用该函数?

时间:2016-08-21 17:35:58

标签: c# properties

我有一个功能,可以在一个类中设置2个列表来从第三方提取 我把它放在一个功能中,因为去第三方需要时间,我只想为这个页面做一次。 这是我的班级:

public class MyClass
{
    public IEnumerable<dynamic> ListOne { get; set; }
    public IEnumerable<dynamic> ListTwo { get; set; }
}

这是我的功能设置&amp;返回列表

public MyClass GetLists()
    {
            //Here I have the code that connects to the third party etc 
            //Here set the items.. from the third party 
             MyClass _MyClass = new MyClass();
            _MyClass.ListOne = ThirdParty.ListOne;
             _MyClass.ListTwo = ThirdParty.ListTwo;
            return (_MyClass);
        };
    }

所以,现在在我的Web API中,我有2个函数 - 一个返回每个列表的函数。

    [Route("ListOne")]
    public IHttpActionResult GetListOne()
        {
        IEnumerable<dynamic> ListOne = GetLists().ListOne;
        return Json(ListOne);
        }

    [Route("ListTwo")]
    public IHttpActionResult GetListTwo()
        {
        IEnumerable<dynamic> ListTwo = GetLists().ListTwo;
        return Json(ListTwo);
        }

我的问题是每次调用webApi getListone或getListTwo时,该函数将再次运行并调用第三方。我怎么能阻止这个?

谢谢!

1 个答案:

答案 0 :(得分:1)

将数据检索逻辑放在属性中并延迟加载数据,即在第一次调用属性时加载它。

private IEnumerable<dynamic> _listOne;
public IEnumerable<dynamic> ListOne {
    get {
        if (_listOne == null) {
            // Retrieve the data here. Of course you can just call a method of a
            // more complex logic that you have implemented somewhere else here.
            _listOne = ThirdParty.ListOne ?? Enumerable.Empty<dynamic>();
        }
        return _listOne;
    }
}

?? Enumerable.Empty<T>()确保永远不会返回null。而是返回一个空的枚举。

请参阅:?? Operator (C# Reference)
Enumerable.Empty Method ()

还要查看Lazy<T> Class