c# - C# 中的有效存储库 - 将方法放在哪里?

标签 c# design-patterns repository

我第一次尝试使用存储库模式构建一个新应用程序,但我对使用存储库有点困惑。假设我有以下类(class):

public class Ticket
{

}
public class User
{
   public List<Ticket>AssignedTickets { get; set; }
}
public class Group
{
   public List<User> GroupMembers { get;set; }
   public List<Ticket> GroupAssignedTickets { get;set; }
}

我需要一种可以通过从数据库中获取数据来填充这些集合的方法。

我对应该将这些方法放入哪个关联的 Repository 类感到困惑。我是否应该设计我的存储库,以便返回类型 T 的所有内容都进入类型 T 的存储库中?
public class TicketRepository
{
   public List<Ticket> GetTicketsForGroup(Group g) { }
   public List<Ticket> GetTicketsForUser(User u) { }
}
public class UserRepository
{
  public List<User> GetMembersForGroup(Group g) { }
}

我在这里看到的明显缺点是我需要开始实例化很多存储库。如果我的用户还分配了小部件、Fidgets 和 Lidgets 怎么办?当我填充一个用户时,我需要实例化一个 WidgetRepository、一个 FidgetRepository 和一个 LidgetRepository 来填充一个用户。

或者,我是否构建我的存储库,以便将基于类型 T 的所有请求都集中到类型 T 的存储库中,如下所示?
public class GroupRepository
{
    public List<Ticket> GetTickets(Group g) { }
    public List<User> GetMembers(Group g) { }
}
public class UserRepository
{
   public List<Ticket> GetTickets(User u) { }
}

我在这里看到的优势是,如果我现在需要我的用户拥有一组 Widget、Fidget 和 Lidget,我只需将必要的方法添加到 UserRepository 模式中,而无需每次都实例化一堆不同的存储库类我想创建一个用户,但现在我已经将用户的关注点分散到了几个不同的存储库中。

我真的不确定哪种方式是正确的,如果有的话。有什么建议么?

最佳答案

存储库模式可以帮助您:

Put things that change for the same reason together





Separate things that change for different reasons



总的来说,我希望“用户存储库”成为获取用户的存储库。理想情况下,它将是您可以用来获取用户的唯一存储库,因为如果您更改内容,例如用户表或用户域模型,您只需要更改用户存储库。如果您在许多存储库上都有获取用户的方法,那么它们都需要更改。

限制变化的影响是好的,因为变化是不可避免的。

至于实例化许多存储库,使用依赖注入(inject)工具(例如 Ninject 或 Unity)来提供存储库,或者使用存储库工厂,可以减少新建大量存储库。

最后,您可以查看域驱动设计的概念,以了解有关域模型和存储库背后的关键目的的更多信息(以及与您正在做的事情相关的聚合根)。

关于c# - C# 中的有效存储库 - 将方法放在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25046694/

相关文章:

javascript - 使对象可观察

c# - DTO 的组件也是实体还是 DTO?

design-patterns - 具有共享方法的 swift 抽象类

java - 使用 Netbeans 的多个本地和远程 git 存储库

Github API : Getting topics of a Github repository

c# - 从 ComboBox (DropDownList) Winforms 中删除项目

c# - native 库预加载器正在尝试加载 native SQLite 库 SQLite.Interop.dll"...

git - 如何将预推送 git hook 添加到现有存储库?

c# - 设置从其他表单可见的控件

c# - AnonymousId 始终为空