类设计-在类中加载列表,或者可以用任何其他方式完成

本文关键字:任何 方式完 其他 或者 加载 列表 | 更新日期: 2023-09-27 18:01:48

我目前正在设计一个类"User"

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
    }
  }
  ....
}

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

可以这样创建类吗?还是有更好的方法?任何帮助将是非常感激的。谢谢。

类设计-在类中加载列表,或者可以用任何其他方式完成

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

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

除了Chris提到的,还有一点,看看这条规则:

CA1002:不要暴露通用列表。

所以一般来说,类不应该公开任何返回泛型列表的属性。试着使用其中一个:

System.Collections.ObjectModel.Collection

System.Collections.ObjectModel.ReadOnlyCollection

System.Collections.ObjectModel.KeyedCollection

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

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