我Repository Pattern
在开发 ASP.NET MVC 应用程序(使用 .NET 3.5、ASP.NET MVC 1.0 和实体框架)时试图理解 ,。我已经获得了足够的依赖注入,并且都可以使用一种控制器和一种实体类型,但是现在我已经实现了对不同类型之间关系的支持,但我被卡住了。
在我见过的所有示例中,存储库接口都被称为IContactsRepository
,并且包含Contact
仅与项目有关的(CRUD)方法。我想实现 的分组Contacts
,所以我有一个名为 的实体类型Group
,以及一个IGroupRepository
用于处理组(CRUD)操作的接口。
- 与多个实体类型相关的方法属于哪里(在这种情况下,例如
AddToGroup
添加 aContact
到 a的方法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>()
我收到一条关于继承 viaIContactsRepository
和Get<Group>()
来自 via之间歧义的构建错误消息IGroupsRepository
。我知道这是不允许的,因为IRepository
继承了具有不同类型的相同通用接口(参见链接文章中的示例 5)。
现在,由于我通过其他接口继承,是否有机会“覆盖”这些方法的名称,例如如下所示?
IContactsRepository : ITypedRepository<Contact> { IEnumerable<Contact> GetContacts = ITypedRepository<Contact>.Get(); ... }
这样,我可以IRepository.Getcontacts
毫无歧义地访问它。是否有可能,或者是否有任何解决此问题的方法?
还有一个新问题,需要澄清:
无论如何在控制器的调用中指定
Get()
我想要哪种方法?解决我最初的问题的最佳方法是什么 - 需要一个可以处理很多事情的存储库,而不仅仅是一种实体类型?
编辑:添加了类的代码示例Repository
并从Controller
.