在重构ASP.NET MVC 5 Web项目的过程中,我看到有机会将一些选择列表移动到另一个类,其中多个控制器可以访问它们。这将允许我删除重复的代码。
在这种情况下,选择列表需要访问数据库。手动编码可能随时间变化的列表是不可行的(因此,数据库查询)。
虽然我没有编译器错误且页面出现按预期工作,但我不确定是否通过采用这种方法创建其他问题。下面显示的代码方法是否是实现此结果的“坏”方法?有更好的方法吗?
总之,这就是我在做的事情:
班级:
public static class ElpLookupLists
{
private static readonly EllAssessmentContext Db = new EllAssessmentContext();
// code...
internal static IEnumerable<SelectListItem> StandardSelectList(string selectedDomain)
{
return Db.ElpStandardLists.Where(m => m.Domain == selectedDomain)
.Select(m => m.Standard).Distinct()
.Select(z => new SelectListItem { Text = z.ToString(), Value = z.ToString() }).OrderBy(z => z.Value)
.ToList();
}
internal static IEnumerable<SelectListItem> PerformanceIndicatorSelectList(string selectedDomain, int? selectedStandard,
string selectedSubConcept)
{
var query =
Db.ElpStandardLists.Where(m => m.Domain == selectedDomain).Where(m => m.Standard == selectedStandard);
if (!string.IsNullOrEmpty(selectedSubConcept)) query = query.Where(m => m.SubConcept == selectedSubConcept);
var list =
query.Select(m => m.PerformanceIndicator)
.Distinct().OrderBy(m => m)
.Select(z => new SelectListItem { Text = z.ToString(), Value = z.ToString() })
.OrderBy(z => z.Text).ToList();
return list;
}
}
答案 0 :(得分:2)
在我看来,更好的选择是创建一个单独的控制器,其中包含获取此数据的方法,您可以OutputCache
这种方法。然后,您可以在其他控制器中调用此方法,并且每次都不会使数据库跳闸。返回值将被缓存。您当然可以控制缓存设置。
这种技术优于您的优势在于,在您的情况下,数据库跳转将始终在应用程序启动时发生,因为该方法是静态的,无论您是否打算使用它。而通过使用缓存方法,您可以在第一次调用方法时使数据库跳闸。