我正在构建一个内容管理的网站,其中包含由我工作的几个开发人员构建的自行开发的API。 API只是Sitecore CMS(在本例中是我们的CMS)和我们用于将数据项绑定到控件的C#代码之间类似LINQ的类似ORM的层。我发现在几个地方我有机会决定创建方法和属性来检索“子项”以获取数据。
为了解释Sitecore术语,假设单词“template”表示代表某种Sitecore类型的自定义类。
// retrieve all children of the Sitecore template "Content Folder" below the PageData section
// assume PageData is an object that represents that section in the Sitecore content tree
public List<ContentFolder> GetContentFolders() {
return PageData.CurrentItem.ChildrenByTemplate("Content Folder").As(i => new ContentFolder(i));
}
上面的代码将在PageData部分执行一些LINQ以获取“内容文件夹”类型的子项列表。 注意:.As()
只是一种扩展方法,可以轻松制作该类型的列表。在这个例子中,它显然是一种方法。但是,它应该是公共财产吗? E.g。
public List<ContentFolder> ContentFolders {
get {
return PageData.CurrentItem.ChildrenByTemplate("Content Folder").As(i => new ContentFolder(i));
}
}
哪个更合适?他们是平等的吗?我肯定找到了一个明确的例子,说明何时方法更有意义:我需要传递参数的任何情况或者我可以重载参数的情况。 E.g。
public List<SupportProductItem> GetSupportProductItems() {
return GetSupportProductItems(true);
}
public List<SupportProductItem> GetSupportProductItems(bool excludeUnsetProducts) {
var productItems = CurrentItem.ChildrenByTemplate("Support Product Item").As(i => new SupportProductItem(i));
if(excludeUnsetProducts)
productItems = productItems.Where(i => i.ProductSelector.IsSet).ToList();
return productItems;
}
我选择一个方法属性(在我看来)的情况是我只是检查一些简单的东西而不是检索数据列表,例如。
public bool IsSet {
get {
return (CurrentItem != null);
}
}
而不是:
public bool IsSet() {
return (CurrentItem != null);
}
所以代码看起来像:
...
if(ContentFolder.CurrentItem.IsSet) {
// code
}
...
在决定使用方法与属性之间时,除了重载和个人偏好之外还有其他事情需要考虑吗?我应该考虑什么“技术性”?
答案 0 :(得分:4)
适用正常的Properties vs. Methods指南。
答案 1 :(得分:3)
我确信之前已经出现了这个问题,但基本上属于一个属性:
a)相对较快的 b)没有副作用
因此,如果您的查询需要花费大量时间,则应考虑将其放入方法中。否则,房产就好了。