rav*_*agw 4 c# design-patterns repository
我正在尝试首次使用Repository模式构建一个新的应用程序,我对使用Repository有点困惑.假设我有以下类:
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; }
}
Run Code Online (Sandbox Code Playgroud)
我需要一种方法,可以通过从数据库中提取数据来填充这些集合.
我很困惑,我应该把这些方法放在哪个相关的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) { }
}
Run Code Online (Sandbox Code Playgroud)
我在这里看到的明显缺点是我需要开始实例化大量的存储库.如果我的用户还分配了窗口小部件,窗口小部件和小部件怎么办?当我填充用户时,我需要实例化一个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) { }
}
Run Code Online (Sandbox Code Playgroud)
我在这里看到的优点是,如果我现在需要我的用户拥有一个Widgets,Fidgets和Lidgets的集合,我只需要为UserRepository模式添加必要的方法,并且不需要每次都实例化一堆不同的存储库类我想创建一个用户,但现在我已经分散了几个不同存储库中用户的顾虑.
我真的不确定哪条路是对的,如果有的话.有什么建议?
存储库模式可以帮助您:
把出于同样原因改变的东西放在一起
以及
分开因不同原因而改变的事物
总的来说,我希望"用户存储库"成为获取用户的存储库.理想情况下,它将是您可以用来获取用户的唯一存储库,因为如果您更改了诸如用户表或用户域模型之类的东西,您只需要更改用户存储库.如果您有许多存储库上的方法来获取用户,那么他们都需要更改.
限制变革的影响是好的,因为变革是不可避免的.
至于实例化许多存储库,使用依赖注入工具(如Ninject或Unity)来提供存储库或使用存储库工厂,可以减少大量存储库的增加.
最后,您可以查看域驱动设计的概念,以了解有关域模型和存储库背后的主要目的的更多信息(以及与您正在执行的操作相关的聚合根).