存储库模式:好还是坏?

时间:2011-12-08 18:16:04

标签: asp.net-mvc repository-pattern

在阅读了ASP.NET MVC 3.0项目中的存储库设计模式的好处(并使用)后,我遇到了一个令我困惑的问题,并开始质疑该模式的好处。也许有人可以帮我澄清一下。

我有以下3个表:

  • - 用户parent
  • - UserLead child of User
  • - UserLeadNotes child of UserLead

粗略地说,表格及其关系的设计如下:

  • 用户 [Id]
  • UserLead [Id,UserId(外键)]
  • UserLeadNotes [Id,UserLeadId(外键)]

我有一个BaseRepository,它包含基本的CRUD方法。 (IEnumerable<TEntity> Get(), TEntity GetByID(), Insert(), Delete(), etc…)

有了这个,我还有一个Service Layer,在需要的时候调用适当的存储库。

简而言之,应用程序显示UserLead并允许用户向UserLead添加/删除注释(在UserLeadNotes表中存储/删除)。添加/删除注释是通过Ajax调用完成的。注释的删除沿着我要删除的注释的“id”传递。

现在......在我实际删除笔记之前,我需要确保笔记真正属于当前登录用户(User.Identity.Name aka UserId

考虑到我的UserLeadNotes TABLE 在{{1}上有外键,考虑我的方法deleteUserNote(int noteId)只会收到“noteId”参数 AND 我需要做的是添加一个

  

.INCLUDE(“UserLead”)

在我的UserId内有类似的内容:

_userLeadNoteRepository

然后我会删除刚刚找到的 UserLeadNote 对象:

UserLeadNote userLeadNote = _userLeadNoteRepository
                .AllIncluding(p => p.UserLead)
                .FirstOrDefault(p => p.UserLeadNoteID.Equals(noteId) 
                   && p.UserLead.UserID.Equals(User.Identity.Name));

问题:

按照上述方法,这将迫使我_userLeadNoteRepository.Delete(userLeadNote); 为我的UserLeadNotes和a)创建一个存储库,因为.Include()所发现的userLeadNote对象将具有一个名为{{1}的属性保存UserLead表中定义的所有字段。

如果我的UserLead表恰好有14个字段,其中10个字段是 ntext ,那意味着我将无需加载/保存太多信息!

如果我要使用而不是Lambda表达式,Linq语句绕过存储库并直接使用我的上下文:

b)

这种方法不会更有效率,因为它会从UserLead表中带回那些不必要的字段吗? (例如,那10个ntext字段)。

除非我没有正确使用存储库模式,或者这可能是实体框架问题,否则我想知道别人的想法!

请记住,我知道拥有存储库模式的好处,但如果这是人们有或没有的某种问题,那就很好奇。如果是这样,他们决定放弃模式并使用Linq语句直接使用他们的Context。

两个邪恶中较小的一个是什么?

2 个答案:

答案 0 :(得分:2)

总之,

阅读Ryan和Rouen的帖子后,似乎每个实体创建一个存储库可能不是合适的方法。如果我有一个孩子(或孩子的孩子)实体,我应该创建一个单一的父信息库,并通过孩子(或孩子的孩子)导航。

我遇到的问题是,当尝试删除子实体的子项(没有Parent的外键)时,我必须.Include(“”)那些其他“上”表。 (在我的情况下,它只有一个表,父,但一个人很容易删除一个孩子的孩子的孩子,并且必须Include()许多“父母/上层”表。

最后,包含Parent表创建了一个属性,该属性包含Parent的所有字段,在我的情况下,这被认为是“获取”太多信息,用于我手边的简单任务。

如果我要删除存储库模式的使用而不是直接使用Context,那么可以避免这个所谓的问题。

对于某些人来说,这可能不是问题(或者他们根本不知道发生了什么),而对于其他人来说,使用模式可能会超过其可能的缺点。

我还没有决定完全删除存储库模式,因为我喜欢它带来的内容。

感谢所有人。

答案 1 :(得分:1)

试着看看这里:

asp.net mvc page is not showing properties from associated objects

我的回答是关于这种滥用通用存储库模式的解释/意见