Asp.net mvc MVC存储库模式设计决策
我有一个asp.NETMVC应用程序,最近开始使用服务验证层实现存储库模式,非常类似于 我已经为我创建的每个模型创建了一个存储库/服务。这是不是太过分了?相反,我应该为每个逻辑业务领域创建一个存储库/服务,为许多不同的模型提供CRUD吗Asp.net mvc MVC存储库模式设计决策,asp.net-mvc,model-view-controller,design-patterns,repository-pattern,Asp.net Mvc,Model View Controller,Design Patterns,Repository Pattern,我有一个asp.NETMVC应用程序,最近开始使用服务验证层实现存储库模式,非常类似于 我已经为我创建的每个模型创建了一个存储库/服务。这是不是太过分了?相反,我应该为每个逻辑业务领域创建一个存储库/服务,为许多不同的模型提供CRUD吗 在我看来,我要么用许多文件把项目树弄得乱七八糟,要么用许多方法把一个类弄得乱七八糟。6一打半另一打。你能想出任何好的论点吗?这是我最近提出的一个问题,尽管得到了好几个好的答案,但我最终得出了自己的结论——没有正确的答案。这并不意味着没有错误的答案,事实上有很多错
在我看来,我要么用许多文件把项目树弄得乱七八糟,要么用许多方法把一个类弄得乱七八糟。6一打半另一打。你能想出任何好的论点吗?这是我最近提出的一个问题,尽管得到了好几个好的答案,但我最终得出了自己的结论——没有正确的答案。这并不意味着没有错误的答案,事实上有很多错误的答案,但正确的答案总是取决于你自己的具体情况 我最终得到了四个存储库,以及EF4实体模型的一个部分类扩展,用于子实体的标准CRUD操作(地址、电话号码、状态代码等),因此它们可以一次性实现,并且可以在所有存储库中使用。然而,我仍在不断完善它,所以也许我还没有找到最好的解决方案 我的建议是试一下,看看是否合适,感觉是否合适。通常,如果感觉不对,那就是错了
如果你真的害怕弄乱你的源代码树,你可以把模型部分分解成它自己的库,并把它作为一个依赖项包含进去 通常,如果您使用的是“真正”的存储库模式,而不是其他持久性层(例如ActiveRecord或DAO),那么您应该确定您的域聚合,并为每个聚合创建一个存储库 这是什么意思?嗯,这在很大程度上取决于你的应用程序,但通常有一些对象是其他对象的自然“父对象”,或者是相关事务的一部分 我认为典型的例子是一个电子商务系统,其中你有一个订单的概念,在一个订单中你有订单行,每个订单行是一些产品和数量,等等 在这种情况下,Order对象是系统的聚合根之一,并创建OrderRepository 在这种情况下需要记住的是,订单和订单行之间存在某种关系(隐含的或其他的),等等。因此,存储库中“CRUD”的C-UD部分通常应该是每个方法中的一个,并且通常应该只获取聚合根对象的一个实例并对其进行操作(.e.repo.Save(order))。可能存在其他可能的参数,但这取决于您的impl 事实上,您通常可以通过继承来解决大部分C-UD部分(即,创建一个RepositoryBase,使用一些已知的逻辑来实现它们,关于您的特定持久性方案应该发生什么) 这就剩下了积垢的R部分。在这种情况下,如果您选择使用查询方法路线,您可能会得到大量的查询方法(GetById;GetByName;GetByCustomerName等)。有些人更喜欢,尤其是对于简单的应用程序,公开基于linq的接口(例如IQueryable GetAll()),然后应用Where子句。YMMV取决于您的基础持久性,但对于简单的应用程序,尤其是您希望持久性提供商直接支持linq的应用程序,它是一个可靠的选择 最后,许多人实际上通过命令查询责任分离模式的一种或另一种实现来分离查询部分,这表示持久化和查询的接口应该不同。在这种情况下,您将拥有一个Repo,它只包含基本的CRUD(GetById、GetAll、Save、Delete)操作和另一个类,该类根据您的应用程序的意图进行查询 希望有帮助
保罗保罗谢谢你的详细回答。经过深思熟虑和阅读,我觉得每个聚合根都有一个存储库/服务。您对CRUD的看法也是正确的,C_UD中各有一个方法,R中有很多方法。在您的订单示例中,OrderRepository是否也是放置R方法用于订单行和订单子行的地方?这是一个好问题,这取决于具体情况。订单行和子行在没有关联订单的情况下是否真的意味着有用的东西?如果是,那么是,如果不是,那么所有查询都必须按w/顺序进行,并且可以使用IEnumerables上的正则LINQ表达式筛选子集合。