Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.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#_Entity_Domain Driven Design_Repository Pattern - Fatal编程技术网

C# 存储库模式是否可用于加载";“部分实体”;

C# 存储库模式是否可用于加载";“部分实体”;,c#,entity,domain-driven-design,repository-pattern,C#,Entity,Domain Driven Design,Repository Pattern,我试图更好地理解域驱动设计中的存储库模式。存储库模式实现的所有示例都只处理实体。但如果我只需要检索实体的一部分,该怎么办?例如,我有一个拥有大量属性的客户端实体。我可以在ClientRepository中定义这样的内容吗: public IEnumerable<string> GetClientsNames() { ... } public IEnumerable GetClientsNames(){…} 偶数: class ClientBaseInfo //in

我试图更好地理解域驱动设计中的存储库模式。存储库模式实现的所有示例都只处理实体。但如果我只需要检索实体的一部分,该怎么办?例如,我有一个拥有大量属性的客户端实体。我可以在ClientRepository中定义这样的内容吗:

public IEnumerable<string> GetClientsNames() {  ...  }
public IEnumerable GetClientsNames(){…}
偶数:

class ClientBaseInfo       //includes some subset of properties of Client entity
{
    public string Name {get; set;}
    public string Surname {get; set;}
    public int Age {get; set;}
    public string Email {get; set;}
}

....

public IEnumerable<ClientBaseInfo> GetClientsBaseInfo() {  ...  }
class ClientBaseInfo//包含客户端实体的某些属性子集
{
公共字符串名称{get;set;}
公共字符串姓氏{get;set;}
公共整数{get;set;}
公共字符串电子邮件{get;set;}
}
....
public IEnumerable GetClientsBaseInfo(){…}
这种实现的原因是性能。不管怎样,我认为我的代码会被这种“部分实体”污染。在现实项目中是否以某种方式使用了这种方法?或者避免加载重实体的唯一方法是拆分表及其对应的实体或其他什么


编辑:是的,我说的是DTO之类的东西。我怀疑存储库是用于处理此类对象,还是仅用于业务实体。我可以为特定情况定义许多不同的DTO,但是我的代码会变得太复杂吗?我没有答案,因为我没有足够的经验。我想知道一些有经验的人的意见。

一如既往,这要视情况而定

您的业务逻辑不应该依赖于数据库结构

它应该代表您的业务逻辑。这意味着,在设计实体及其关系时需要小心

另一方面,这取决于为什么只需要加载实体属性的一部分

如果一个类中有这么多属性,也许您应该更改域逻辑

也许你需要

您可以创建DTO类,该类将是您的实体的“简单版本”,仅用于传输数据

更新:

您可以在存储库中使用dto。有些情况下,它是需要的(报告等)

以下是有关NHibernate

这种方法在少数情况下是可以接受的

如果您需要在应用程序中使用dto,这意味着您需要更改域层


也许你应该把你的类分成更小的类,然后分别加载它们

对于这类查询,建议的方法是使用读取模型(CQRS样式)

因此,您可以实现一个非常薄的查询层,该查询层返回一个基本的结构,以满足您的需要。在c#world中,我选择从
DataRow
DataTable
到DTO(用于更复杂的结构)的任何东西

请记住,读取模型并不意味着最终的一致性,您的查询端可以处于任何级别,从同一个表/数据库中的100%一致性到另一个数据库中的最终一致性


因此,这些类型的查询不适合存储库模式。

您不应该反转继承概念,您可以定义“大量属性”吗?当您从回购协议中获得聚合根时,聚合根应该被完全加载。如果它太大,也许你应该考虑改变你的聚合设计。+ 1库不是查询()