我试图在我的MVC程序设计中使用存储库,但遇到了如何最好地构造存储库的问题。

例如,假设我有一个对象USers,并且我有一个UserRepository,它具有诸如getUser(int id)saveUser(Dal.User model)等功能。

因此,如果在我的控制器中我有EditUser,并且我想显示一个包含用户详细信息输入表单的视图。 所以我可以做这样的事情:

User user = _userRepository.getUserDetails(userId);

好处是我的控制器仅处理处理HTTP请求,并且业务逻辑已移至存储库,从而使测试等变得更加容易

因此,假设我想显示此用户在我的系统中可能具有的角色的下拉列表,即客户端,管理员,员工等

在_userRepository中具有名为getPossibleUserRoles()的函数是可以的吗?还是我应该将单独的_roleRepository与函数getRoles()分开?

将遇到的每个实体的存储库注入控制器中不是一个好主意吗? 还是在存储库中混合实体,使它们混乱,是一个坏主意。

我意识到我已经提出了一个非常简单的方案,但是显然随着系统复杂性的增加,您可能会谈到需要为每个页面调用在控制器中实例化10个存储库。 并且还可能实例化当前控制器方法中未使用的存储库,只是为了使其可用于其他控制器方法。

任何有关如何最好地使用存储库来构建项目的建议都值得赞赏

===============>>#1 票数:1

在_userRepository中具有名为getPossibleUserRoles()的函数是可以的吗?还是我应该将单独的_roleRepository与函数getRoles()分开?

两种解决方案都是可以接受的,但是请考虑如何控制存储库的扩散以及这些存储库上的方法。 恕我直言,典型的存储库使用方案往往最终会导致存储库过多,并且每个存储库上都有太多方法。 DDD提倡每个聚合根都有一个存储库。 这是一个很好的经验法则……如果您遵循DDD原则。

将遇到的每个实体的存储库注入控制器中不是一个好主意吗? 还是在存储库中混合实体,使它们混乱,是一个坏主意。

注入易失性依赖项,因此可以,为控制器所需的每个实体注入一个存储库。 但是,一旦开始注入四个以上的依赖项,您很可能错过了设计中某处的抽象。 有人用RepositoryFactory解决了这个问题,但是可以说,这引入了不透明依赖关系的问题,恕我直言,IMHO无法传达类的实际依赖关系,从而降低了其可用性和自文档能力。

看看使用查询对象而不是存储库( https://lostechies.com/jimmybogard/2012/10/08/favor-query-objects-over-repositories/等),并看看使用编排/中介( http://codeopinion.com/thin-controllers-cqrs-mediatr/ )在您的控制器中。 我认为您会发现更好的设计可以帮助您解决设计问题。

===============>>#2 票数:1 已采纳

在_userRepository中具有名为getPossibleUserRoles()的函数是可以的吗?还是我应该将单独的_roleRepository与函数getRoles()分开?

假设您有一些控制器调用:

_userRepository.getUserDetails(userId);

但是他们从不打电话给:

_userRepository.getPossibleUserRoles(userId);

然后,您将迫使控制器依赖于不使用的方法。

不仅不行,还应该分开。

但是,如果getUserDetailsgetPossibleUserRoles是令人讨厌的(共享相同的实体,共享相同的业务逻辑等)。

除了为Roles创建新类外,您可以在不更改userrepository的实现的情况下拆分它。

public class UserRepsitory : IUserRoles, IUserRepository
{

} 

我意识到我已经提出了一个非常简单的方案,但是显然随着系统的复杂性增加,您可能正在谈论需要在控制器中实例化数十个存储库的情况。

如果构造函数获取的参数过多,则很可能违反SRP。 Mark Seemann在这里展示了如何解决此问题。

简而言之:在创建行为时,如果始终同时使用两个或两个以上的存储库。 然后,这些存储库非常接近。 因此,您可以创建服务并在该服务中对其进行编排。 之后,除了在控制器构造函数中使用2个或更多存储库之外,还可以将此服务用作参数表。

  ask by Kevin Bradshaw translate from so

未解决问题?本站智能推荐:

3回复

存储库模式是什么类型的?

总的来说,我知道有三种大型的设计模式 创作模式(工厂,单身等) 结构模式(复合,适配器,代理等) 行为模式(规范,命令等) 但我不知道我可以将Repository模式放入哪种类型。 存储库模式是否属于以上三种类型之一? 或者它是在(2)和(3)模式的中间
2回复

在MVC中设置存储库模式

我试图弄清楚Repository模式如何工作以及如何在自定义MVC模式中实现它。 据我所知,Repository是一个简单地从实体类返回数据或将实体类保存到持久层的层。 现在我现在看到它是这样的: 请求进入我的控制器以创建用户。 只是一个用户名和密码。 我的控制器将执行以下
1回复

聚合和存储库。 如何确定聚合?

我最近一直在查看存储库模式,以便在客户端代码所关注的地毯下刷新持久性的所有细节。 虽然阅读它似乎是一个存储库/可以[通常?]负责聚合而不仅仅是直接的类。 这对我来说很有意义,因为你可以有一个定义帖子和另一个定义评论的类 。 这是聚合的理想候选者,因为这两者是非常密切相关的。 但是,我
1回复

Laravel上的存储库模式

我想使用Repository Pattern但我坚持语法。 我想得到我的函数index()。 第一步,我创建文件夹Repositories然后创建文件AuteurRepository.php 在我的文件AuteurController中我有这个: 在我的模型中,我只有
1回复

Laravel 5的存储库模式

我在app / Repositories中创建了一些Repositories类,如SeriesRepository , CommentRepository等。我这样做的想法是抽象数据库调用,所以我可以使用Eloquent或查询构建器甚至原始SQL,如果我愿意,而不必更改查询在代码中的数千个地方。
4回复

存储库模式问题

我首先为我的每个实体创建了一个新的存储库接口,例如IClientRepository。 然后我为每个实体创建了一个类,例如SqlClientRepository。 我为很多实体做了这个,然后意识到他们都有相同的方法:添加,更新,删除,GetAll。 所以我意识到我应该只创建一个界面,而
2回复

用存储库模式查询

我有以下数据库模型: 我使用Linq-to-SQL和Design Pattern Repository来描述下面的页面http://www.remondo.net/repository-pattern-example-csharp/ 这是一个类图: 我想进行这样的查询,但改为使
3回复

DI和存储库模式

目前,我的代码与此类似(缩短只是为了说明一点): DAL 存储库接口 基本EF存储库 基本存储库的示例实现 BLL 现在,一切都很好。 我可以简单地做这样的事情: 当我阅读这篇博文时,混乱开始,作者说使用如下代码: 是一种糟糕的技术,
2回复

存储库模式实施经验

我准备开始一个新的asp.net Web项目,并且要使用LINQ-to-SQL。 我已经完成了一些工作,使用Mike Hadlow发现的一些信息来设置数据层,该信息使用接口和泛型为数据库中的每个表创建一个存储库。 我一开始认为这是一种有趣的方法。 但是,现在我认为创建一个基本的Reposi
2回复

存储库模式和共享实体

我正在考虑使用存储库设计模式进行数据抽象,我正在使用Phalcon PHP框架并使用以下结构: 现在,如果我必须在另一个ModelB中使用相同的Entity2.php,我将失去对存储库模式的最方便的使用,即我只能通过修改RepositoryA.php来改变Entity2.php的数据源。