没有ORM的数据访问层

时间:2013-01-12 11:52:03

标签: c# repository-pattern data-access-layer

我正在编码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],...)等等。 我是对的吗?

2 个答案:

答案 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的任何特定功能来满足您的性能标准。