Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.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
Oop 存储库模式-结构化存储库_Oop_Design Patterns_Repository Pattern - Fatal编程技术网

Oop 存储库模式-结构化存储库

Oop 存储库模式-结构化存储库,oop,design-patterns,repository-pattern,Oop,Design Patterns,Repository Pattern,我试图在我的MVC程序设计中使用存储库,但我遇到了一个如何最好地构造它们的问题 例如,假设我有一个objectusers,我有一个UserRepository,它具有像getUser(intid),saveUser(Dal.User model)等功能 所以,如果在我的控制器中有EditUser,我想显示一个视图,其中包含一个用户详细信息输入表单。所以我可以这样做: User user = _userRepository.getUserDetails(userId); 好处是,我的控制器只处理

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

例如,假设我有一个objectusers,我有一个UserRepository,它具有像
getUser(intid)
saveUser(Dal.User model)
等功能

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

User user = _userRepository.getUserDetails(userId);
好处是,我的控制器只处理HTTP请求,业务逻辑被转移到存储库,使测试等变得更容易

所以,假设我想显示一个下拉列表,列出这个用户在我的系统中可能扮演的角色,如客户、管理员、职员等

在_userRepository中有一个名为getPossibleUserRoles()的函数可以吗?还是应该有一个单独的_roleRepository和一个函数getRoles()

将您遇到的每个实体的存储库注入控制器是一个坏主意吗?或者,在存储库中混合实体是个坏主意,让它们变得杂乱无章

我意识到我已经提出了一个非常简单的场景,但很明显,随着系统复杂性的增加,您可能会提到10个存储库需要在控制器中为每个页面调用实例化。还可能实例化当前控制器方法中未使用的存储库,以便其他控制器方法可以使用这些存储库

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

在_userRepository中有一个名为getPossibleUserRoles()的函数可以吗?还是应该有一个单独的_roleRepository和一个函数getRoles()

两种解决方案都是可以接受的,但是考虑一下如何控制存储库和方法在这些存储库上的扩散。依我看,典型的存储库使用场景最终往往会有太多的存储库,每个存储库上都有太多的方法。DDD主张每个聚合根都有一个存储库。这是一个很好的经验法则。。。如果你遵循DDD原则

将您遇到的每个实体的存储库注入控制器是一个坏主意吗?或者,在存储库中混合实体是个坏主意,让它们变得杂乱无章

注入易失性依赖项,因此是的,为控制器需要的每个实体注入一个存储库。然而,一旦您开始注入四个以上的依赖项,很可能您在设计中遗漏了一个抽象。有些人用
RepositoryFactory
解决了这个问题,但可以说,这引入了不透明依赖项的问题,并且,IMHO,无法传达类的真正依赖项,降低了它的可用性和自文档能力

请看一下如何使用查询对象而不是存储库(,等等),以及如何在控制器中使用编排/中介()。我认为你会发现一个更好的设计出现,这将有助于你的设计问题

在_userRepository中有一个名为getPossibleUserRoles()的函数可以吗?还是应该有一个单独的_roleRepository和一个函数getRoles()

两种解决方案都是可以接受的,但是考虑一下如何控制存储库和方法在这些存储库上的扩散。依我看,典型的存储库使用场景最终往往会有太多的存储库,每个存储库上都有太多的方法。DDD主张每个聚合根都有一个存储库。这是一个很好的经验法则。。。如果你遵循DDD原则

将您遇到的每个实体的存储库注入控制器是一个坏主意吗?或者,在存储库中混合实体是个坏主意,让它们变得杂乱无章

注入易失性依赖项,因此是的,为控制器需要的每个实体注入一个存储库。然而,一旦您开始注入四个以上的依赖项,很可能您在设计中遗漏了一个抽象。有些人用
RepositoryFactory
解决了这个问题,但可以说,这引入了不透明依赖项的问题,并且,IMHO,无法传达类的真正依赖项,降低了它的可用性和自文档能力

请看一下如何使用查询对象而不是存储库(,等等),以及如何在控制器中使用编排/中介()。我认为你会发现一个更好的设计出现,这将有助于你的设计问题

在_userRepository中有一个名为 getPossibleUserRoles()还是我应该有一个单独的角色库 使用函数getRoles()

假设您有一些控制器呼叫:

_userRepository.getUserDetails(userId);
但他们从不打电话:

_userRepository.getPossibleUserRoles(userId);
然后,您将强制控制器依赖于它们不使用的方法

所以这不只是好的,你应该把它分开

但是如果选择了
getUserDetails
getPossibleUserRoles
(共享相同的实体、共享相同的业务逻辑等)

除了为
角色
创建新类之外,您还可以在不更改userrepository的实现的情况下拆分该类

public class UserRepsitory : IUserRoles, IUserRepository
{

} 
我意识到我提出了一个非常简单的方案,但显然 随着系统复杂性的增加,您可能会谈论10秒的时间 需要在控制器中实例化的存储库

如果构造函数获取的参数太多,则SRP冲突的可能性很高。Mark Seemann在中演示了如何解决此问题

简而言之:当您创建一个行为时,如果您总是同时使用2个或多个存储库。然后,这些存储库非常接近。因此,您可以创建一个服务并在此服务中协调它们。之后,除了在控制器构造函数中使用2个或更多存储库之外,还可以将此服务用作参数

在_userRepository中有一个名为 getPossibleUserRoles()还是我应该有一个单独的角色库 使用函数getRoles()

让我们