Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 类设计-在类中加载列表,或者可以通过任何其他方式完成?_C#_Asp.net Mvc_Design Patterns_Asp.net Mvc 5 - Fatal编程技术网

C# 类设计-在类中加载列表,或者可以通过任何其他方式完成?

C# 类设计-在类中加载列表,或者可以通过任何其他方式完成?,c#,asp.net-mvc,design-patterns,asp.net-mvc-5,C#,Asp.net Mvc,Design Patterns,Asp.net Mvc 5,我目前正在设计一个类“用户” 公共类用户 { ... public int LocationId{get;set;} 公共字符串位置名称 { 得到 { //根据LocationId从LocationList获取名称 } } 公共列表位置列表 { 得到 { //从数据库中检索位置作为列表 } } .... } 我担心的是,每次创建新对象时,都会访问数据库并检索位置列表 可以这样创建类吗?还是有更好的方法?任何帮助都将不胜感激。谢谢。只有在访问LocationList时,才会访问数据库,而不是在新

我目前正在设计一个类“用户”

公共类用户
{
...
public int LocationId{get;set;}
公共字符串位置名称
{
得到
{
//根据LocationId从LocationList获取名称
}
}
公共列表位置列表
{
得到
{
//从数据库中检索位置作为列表
}
}
....
}
我担心的是,每次创建新对象时,都会访问数据库并检索位置列表


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

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


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

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


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

除了Chris提到的内容之外,还有一点,请查看此规则:

因此,一般来说,该类不应公开任何返回泛型列表的属性。请尝试使用以下选项之一:

System.Collections.ObjectModel.Collection

System.Collections.ObjectModel.ReadOnlyCollection

System.Collections.ObjectModel.KeyedCollection


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

因此,一般来说,该类不应公开任何返回泛型列表的属性。请尝试使用以下选项之一:

System.Collections.ObjectModel.Collection

System.Collections.ObjectModel.ReadOnlyCollection

System.Collections.ObjectModel.KeyedCollection


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


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

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


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

LocationName
LocationList
不会在每次创建新的
用户时访问(当然,除非您在构造函数中获取
它们)。作为属性,只有在引用它们时才能访问它们。
LocationName
LocationList
不会在每次创建新的
用户时访问(当然,除非您在构造函数中获取它们)。作为属性,只有在引用它们时才能访问它们。
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
    }
  }
  ....
}