使用ServiceStack.ORMLite构建存储库

时间:2012-10-04 17:54:40

标签: repository-pattern servicestack ormlite-servicestack

我正在使用servicestack,我打算使用ormlite作为数据访问层。 我有这些表(SQL Server 2005)

Table ITEM
ID PK
...

Table SUBITEM1
ID PK FK -> ITEM(ID)
...

Table SUBITEM2
ID PK FK -> ITEM(ID)
...

Table POST
ID PK
...

Table COMMENT
ID PK
...

Table DOWNLOAD
ID PK
...

Table POST_COMMENT
ID PK
POST_ID FK -> POST(ID)
COMMENT_ID FK -> COMMENT(ID)

Table DOWNLOAD_COMMENT
ID PK
DOWNLOAD_ID FK -> DOWNLOAD(ID)
COMMENT_ID FK -> COMMENT(ID)

我为每个表创建了一个类,并使用注释(自动增量,引用等)映射它们。

我决定为每个“实体”(项目,帖子,评论,下载)创建一个存储库。 每个存储库都包含基本的CRUD逻辑,

例如。 1 CommentRepository有一个Save(注释,对象关系),它执行db.Insert(注释,关系),其中关系是PostComment或DownloadComment。

例如。 2 PostRepository有一个Save(Post p)执行插入POST。

我不确定这个解决方案,因为存储库界面不同,我无法进行多态查询。

您能提供任何建议来改善我的DAL吗?

感谢您的关注。

1 个答案:

答案 0 :(得分:11)

我不是强制人工抽象的粉丝所以我不喜欢从每个实体的存储库开始,因为它只会导致不必要的代码膨胀。我喜欢从封装所有数据访问的所有实体开始只有一个存储库,当它变得太大时,自然会重构。

我不太了解您的域名,知道最佳RDBMS布局是什么,但我也希望尽可能避免创建不必要的表格,并且会查看blob非聚合根数据,例如:如果SubItem只能在其父项的上下文之外应用并且没有意义,那么我只想保存几个表,例如:

class Item {
   int Id; //PK, AutoIncr
   List<SubItem> SubItem;
}

而不是单独的Many:许多表,我只是将它保存在单个Comment表中,例如:

class Comment {
    int Id; //PK, AutoIncr
    string CommentType; //i.e. Post or Download
    int RefId;
    string Comment;
}

因此,我的存储库将模仿完成Web请求所需的数据访问模式,例如:

class BlogRepository {
    void AddCommentToPost(int postId, Comment comment);
    void AddCommentToDownload(int downloadId, Comment comment);
}