Class 设计 - 在 class 中加载列表,还是可以通过任何其他方式完成?
Class Design - Load list in the class or can it be done in any other way?
我目前正在设计class"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
}
}
....
}
我担心的是每次创建新对象时,都会访问数据库并检索位置列表。
可以这样创建class吗?或者有更好的方法吗?任何帮助将不胜感激。谢谢
数据库只会在 LocationList
被访问时被访问,而不是在 class 被更新时被访问。但是,不,这不是最好的方法。实体 classes / 视图模型不应直接与您的上下文交互。这样做的最大原因是您实际上应该只有一个并且只有一个上下文实例,并且并不总是可以将它正确地注入这些 classes.
相反,您应该使用存储库或服务 class 来抽象化查询,然后通过调用存储库或服务上的某些方法直接在控制器操作中直接设置列表 属性。
Chris提到的还有一点,看看这条规则:
CA1002: Do not expose generic lists.
所以一般来说,class 不应公开任何返回通用列表的 属性。尝试使用其中之一:
System.Collections.ObjectModel.Collection
System.Collections.ObjectModel.ReadOnlyCollection
System.Collections.ObjectModel.KeyedCollection
每当需要与外部 system/source 通信时,创建一个存储库几乎总是一个好主意。
通过这种方式,您可以在一个地方拥有与给定源交互的所有逻辑,并且可以在那个特定的地方调试和编辑它。另外,正如 Chris Pratt 提到的那样,在任何给定时间你都应该只使用一个数据库上下文。
我目前正在设计class"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
}
}
....
}
我担心的是每次创建新对象时,都会访问数据库并检索位置列表。
可以这样创建class吗?或者有更好的方法吗?任何帮助将不胜感激。谢谢
数据库只会在 LocationList
被访问时被访问,而不是在 class 被更新时被访问。但是,不,这不是最好的方法。实体 classes / 视图模型不应直接与您的上下文交互。这样做的最大原因是您实际上应该只有一个并且只有一个上下文实例,并且并不总是可以将它正确地注入这些 classes.
相反,您应该使用存储库或服务 class 来抽象化查询,然后通过调用存储库或服务上的某些方法直接在控制器操作中直接设置列表 属性。
Chris提到的还有一点,看看这条规则:
CA1002: Do not expose generic lists.
所以一般来说,class 不应公开任何返回通用列表的 属性。尝试使用其中之一:
System.Collections.ObjectModel.Collection
System.Collections.ObjectModel.ReadOnlyCollection
System.Collections.ObjectModel.KeyedCollection
每当需要与外部 system/source 通信时,创建一个存储库几乎总是一个好主意。
通过这种方式,您可以在一个地方拥有与给定源交互的所有逻辑,并且可以在那个特定的地方调试和编辑它。另外,正如 Chris Pratt 提到的那样,在任何给定时间你都应该只使用一个数据库上下文。