我创建了Widget系统,其中小部件可以放置在任何页面上的任何区域(Region)中。 Widget是继承自ClassMapping的模型。 它工作得很好,但在NHibernate中有更简单的方法来完成这个功能吗?我不是NHibernate的专家,所以欢迎任何建议。
问题:我正在考虑session.CreateCriteria(t)中的匿名“t”,它在运行时加载基类Widget,而不是例如继承Widget的Content类,所以我不能使用更早的代码,请参阅第一个代码块。示例:我无法达到例如Region.Sidebar,它总是为每个小部件返回0。这就是为什么我需要在使用它之前将小部件转换为“动态”。请参阅代码中的注释。
注意:TypeResolver返回Widget名称列表。
注意:Region是一个枚举,例如Region.Header。
//Previous method
public static List<IWidget> GetWidgets(string zone, int id)
{
return (from t in new TypeResolver().GetAllWidgets()
select ActiveRecordMediator.FindAll(t) //<!-- Loading all Widgets fine.
into widgets
where widgets.Length > 0
from item in ((IWidget[])widgets)
select item
into a
where a.Zone.Equals(zone) && a.PageId.Equals(id) && a.Active
orderby a.SortOrder
select a).ToList();
}
//Current method
public static partial class HtmlHelperExtensions
{
public static IHtmlString Zone(this HtmlHelper html, Region region)
{
var sb = new StringBuilder();
var session = SessionManager.Instance.GetSession();
var widgetlist = new TypeResolver().GetAllWidgets();
var list = (from t in widgetlist
//This line loads base class -->
select session.CreateCriteria(t).List().As<System.Collections.ArrayList>()
into widgets
where widgets.Count > 0
from item in widgets.ToArray()
select item
into a
select a).ToList();
foreach (var item in list)
{
dynamic widget = item;
if (widget.Region == region && widget.Active && widget.PageId == PageExtensions.CurrentPage.Id)
sb.Append(ViewHelper.Render<Widget>(html, widget.Template, widget));
}
return (sb.ToString().Length > 0) ? new HtmlString(sb.ToString()) : new HtmlString(string.Empty.Space());
}
}