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