我正在为Orchard CMS创建模块 - 查看器小部件,用于自定义ContentType的元素。
所以,我有服务接口:
public interface IReviewGrabber : IDependency
{
IEnumerable<ReviewPart> Reviews { get; }
}
它的实施:
public class ReviewGrabber : IReviewGrabber
{
readonly IOrchardServices _orchardServices;
readonly IEnumerable<ReviewPart> _reviews;
public ReviewGrabber(IOrchardServices orchardServices)
{
_orchardServices = orchardServices;
var temp = _orchardServices.ContentManager.Query<ReviewPart, ReviewRecord>();
_reviews = temp.List();
}
public IEnumerable<ReviewPart> Reviews
{
get { return _reviews; }
}
}
ContentType的处理程序:
public class ReviewHandler : ContentHandler
{
public ReviewHandler(IRepository<ReviewRecord> repository)
{
Filters.Add(StorageFilter.For(repository));
}
}
调试这个,我手动添加了Review类型的元素,它可以工作。在ReviewGrabber
类变量temp
中填写正确,但调用方法List()
会触发错误:
ValueFactory尝试访问此实例的Value属性。
_handlers.Value'_handlers.Value'抛出类型'System.InvalidOperationException'的异常'System.Collections.Generic.IEnumerable {System.InvalidOperationException}
在行
public IEnumerable<IContentHandler> Handlers {
get { return _handlers.Value; }
}
DefaultContentManager.cs
中的
怎么了?谢谢!
答案 0 :(得分:2)
对于初学者来说,在构造函数中进行查询是一个很大的禁忌。构造函数应该只做一些简单的工作,比如初始化变量,而不是查询数据库。
同样,物业瘾君子通常不会做很多工作。您应该使用GetReviews方法,根据需要进行查询。如有必要,可以在以后添加缓存。