我正在编码mmorpg服务器模拟器(爱好项目),我已经停止编写数据访问层。问题是我不能使用ORM(性能问题)。我已经阅读了很多关于Repository模式的信息,但它似乎不适合我的项目,因为我需要的方法如:(player db)GetAllByLevel(...),GetByName(...)等。 我希望我的应用程序与数据库无关。 (我现在正在使用sql server但我想稍后添加对mysql的支持) 哪种数据访问模式适合我的项目?
抱歉我的英语不好。
还有一个问题。我已经读过,存储库模式在agreggate根目录上运行。 我有3个桌面玩家,player_friend和player_chest。播放器是一个agreggate root,如果我没错,我应该创建一个可以拥有以下方法的存储库(PlayerRepository):GetFriends([player id],...),GetChest([player id],...)等等。 我是对的吗?
答案 0 :(得分:5)
我已经阅读了很多关于Repository模式的内容,但它似乎不适合我的项目,因为我需要以下方法:(player db)GetAllByLevel(...),GetByName(...)等等。
恰恰相反。有很多错误的存储库模式示例(通常是漏洞抽象),它们会教你错误。 GetAllByLevel
是一种很好的方法,因为它非常清楚地描述了该方法的作用。
我写过关于存储库模式的文章:http://blog.gauffin.org/2013/01/repository-pattern-done-right/。还请阅读本文开头的抽象链接。
问题是我不能使用ORM(性能问题)。
没问题。存储库模式用于抽象数据源,无论它是哪种类型。
如果您想使用vanilla ADO.NET,可以阅读以下博文:http://blog.gauffin.org/2013/01/ado-net-the-right-way/
还有一个问题。我已经读过,存储库模式在agreggate根目录上运行。我有3个桌面玩家,player_friend和player_chest。播放器是一个agreggate root,如果我没错,我应该创建一个可以拥有以下方法的存储库(PlayerRepository):GetFriends([player id],...),GetChest([player id],...)等等。我是对的吗?
没有。我会说朋友也是根。阅读有关设计聚合的文章:http://dddcommunity.org/library/vernon_2011
答案 1 :(得分:0)
存储库是要走的路。关键是你可以拥有相同存储库接口的多个实现,一个用于sql server,另一个用于oracle或postgresql。您不一定有一个支持所有可能数据库的通用实现(这将非常困难)。
具体实现可以使用具体dbms的任何特定功能来满足您的性能标准。