类设计 - 在类中加载列表还是可以以任何其他方式完成?

时间:2015-07-09 16:41:18

标签: c# asp.net-mvc design-patterns asp.net-mvc-5

我目前正在设计一个班级"用户"

public class User
{
  ...
  public int LocationId {get; set;}
  public string LocationName 
  {
    get
    {
       //Get name from the LocationList based on the LocationId
    }
  }
  public List<SelectListItem> LocationList 
  {
    get
    {
       //Retrieve the location as list from DB
    }
  }
  ....
}

我担心的是每次创建新对象时,都会访问数据库并检索位置列表。

可以通过这种方式创建课程吗?或者有更好的方法吗?任何帮助将受到高度赞赏。感谢。

3 个答案:

答案 0 :(得分:3)

只有在访问LocationList时才会触发数据库,​​而不是在新建类时。但是,不,这不是最好的方法。实体类/视图模型不应直接与您的上下文交互。最大的原因是你应该只有一个且只有一个你的上下文实例,而且并不总是可以将它正确地注入这些类中。

相反,您应该使用存储库或服务类来抽象出查询,然后通过调用存储库或服务上的某个方法直接在控制器操作中设置list属性。

答案 1 :(得分:2)

除了克里斯提到的内容之外,还有一点,请看一下这条规则:

CA1002: Do not expose generic lists

因此,一般来说,该类不应公开返回通用列表的任何属性。尝试使用以下其中一种:

  

System.Collections.ObjectModel.Collection

     

System.Collections.ObjectModel.ReadOnlyCollection

     

System.Collections.ObjectModel.KeyedCollection

答案 2 :(得分:0)

每当与外部系统/源进行通信时,建立存储库几乎总是一个好主意。

通过这种方式,您可以在一个位置拥有与给定源交互的所有逻辑,并且可以在该特定位置调试和编辑它。另外,正如Chris Pratt所提到的那样,您在任何给定时间都应该只使用一个数据库上下文。