使用MVC或类似模式时,属性Getters vs Get方法?

时间:2011-06-24 03:53:49

标签: asp.net-mvc mvvm

并非真的很重要,但我想遵循最佳做法。创建视图模型时,最好使用属性getter或方法吗? e.g

public class ProductViewModel
{
    private readonly Product _product;

    public ProductViewModel(Product p)
    {
        _product = p;
    }

    public string Price
    {
        get { return string.Format("${0}" _product.Price.ToString("N2") };
    }
}

考虑到这是一个简单的例子,使用方法会更好吗?

public string GetPrice()
{
    return string.Format("${0}" _product.Price.ToString("N2");
}

两者之间的利弊是什么?

4 个答案:

答案 0 :(得分:3)

如果您正在使用MVVM,那么您正在使用数据绑定。数据绑定绑定到属性,而不是方法。 (请参阅Binding.Path属性的文档 - 该页面上没有一个单词“method”出现。这都与属性有关。)

所以没有比赛。使用属性,因为这是绑定系统支持的。

答案 1 :(得分:1)

我倾向于财产而远离某个功能。视图模型的要点是以适合在视图中显示的方式呈现模型。通常,视图和视图模型通过绑定相互通信,通常在XAML中完成。

通过使用方法而不是属性,可以使视图与视图模型连接,并减少转向键。

假设你最终在其他地方需要这个价格,保持格式化在旧代码中,但没有新代码中的格式。使用方法,您现在需要另一种方法或属性来获取价格。使用该属性you could just apply a StringFormat to the first binding

<!-- Old code -->
<TextBlock Text="{Binding Price}" />

<!-- New code -->
<TextBlock Text="{Binding Price, StringFormat=${0:N2}}" />
<awesome:MoneyUpDown Value="{Binding Price}" />

答案 2 :(得分:1)

如果您正在使用MVVM,则可能需要INotifyPropertyChanged支持,在这种情况下,属性是可行的方法。有许多框架(例如Caliburn.Micro)可以帮助您最小化重复的crud代码,例如连接通知。

最初的问题是关于MVVM模式。使用普通的MVC(没有数据绑定),答案并不明确。就个人而言,当不需要额外的计算或数据访问时,在获取简单数据时,我仍会使用属性而不是方法。

答案 3 :(得分:0)

第一种方法的一个警告是,您必须实现第二个属性才能在不格式化的情况下获得价格