【发布时间】:2010-11-09 20:34:23
【问题描述】:
在开发 ASP.NET MVC 应用程序(使用 .NET 3.5、ASP.NET MVC 1.0 和实体框架)时,我正在尝试理解 Repository Pattern。我已经获得了足够的依赖注入,并且都可以使用一种控制器和一种实体类型,但现在我已经实现了对不同类型之间关系的支持,但我被卡住了。
在我见过的所有示例中,存储库接口都称为IContactsRepository,并且包含仅与Contact 项目相关的(CRUD)方法。我想实现Contacts 的分组,所以我有一个名为Group 的实体类型和一个IGroupRepository 接口,用于处理组上的(CRUD)操作。
- 与多个实体类型相关的方法属于哪里(在这种情况下,例如方法
AddToGroup,它将Contact添加到Group)?
我尝试为存储库创建更大的继承结构,并在其中创建了以下接口:
ITypedRepository<T>
{
IEnumerable<T> GetAll();
T Get(int id);
bool Add(T newObj);
bool Edit(T editedObj);
bool Delete(int id);
}
IContactsRepository : ITypedRepository<Contact> { }
IGroupsRepository : ITypedRepository<Group> {
bool AddToGroup(int contactId, int groupId);
}
IRepository : IContactsRepository, IGroupsRepository
然后我尝试创建一个继承IRepository的主仓库,如下:
public class EntitiesRepository : IRepository
{
IEnumerable<Contact> IRepository<Contact>.Get()
{
throw new NotImplementedException();
}
IEnumerable<Group> IRepository<Group>.Get()
{
throw new NotImplementedException();
}
// Etc. All methods were generated by hitting [Ctrl]+[.] with the cursor on
// the interface inheritance reference to IRepository and selecting
// "Explicitly implement IRepository"
}
一旦我尝试使用此代码从我的控制器调用存储库中的方法之一
var contacts = _repository.Get();
我收到一条构建错误消息,说明 Get<Contact>() 和 Get<Group>() 之间的歧义是通过 IContactsRepository 继承的,而 Get<Group>() 是通过 IGroupsRepository 传来的。我知道这是不允许的,因为IRepository inherits the same generic interface with different types (请参阅链接文章中的示例5)。
-
现在,由于我是通过其他接口继承的,是否有机会“覆盖”这些方法的名称,例如如下所示?
IContactsRepository : ITypedRepository<Contact> { IEnumerable<Contact> GetContacts = ITypedRepository<Contact>.Get(); ... }
这样,我可以从IRepository.Getcontacts 毫无歧义地访问它。是否有可能,或者是否有任何解决此问题的方法?
还有一个新问题,需要澄清一下:
无论如何在控制器的调用中指定我想要哪个
Get()方法?解决我最初的问题的最佳方法是什么 - 需要一个可以处理很多事情的存储库,而不仅仅是一种实体类型?
编辑:添加了Repository类的代码示例并从Controller调用。
【问题讨论】:
-
考虑显式接口实现。有关详细信息,请参阅stackoverflow.com/questions/1077816/…
-
感谢您的回复 - 我已经尝试过了,并更新了更多代码以进行澄清。
-
每看不懂这个问题就给这个问题加一分
-
甜甜的酒精,让我从这个问题中解脱出来。
-
zvolkov 和 Chris:很抱歉这么长的文字。我对此理解不够好,无法将其缩短。总之,我想问的是a)如何为多种类型的实体设置存储库以及b)如何解决在使用不同类型多次继承相同的通用接口时出现的问题。
标签: c# design-patterns interface repository-pattern multiple-inheritance