Oop 存储库模式-结构化存储库
我试图在我的MVC程序设计中使用存储库,但我遇到了一个如何最好地构造它们的问题 例如,假设我有一个objectusers,我有一个UserRepository,它具有像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); 好处是,我的控制器只处理
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()
让我们