1

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>()我收到一条关于继承 viaIContactsRepositoryGet<Group>()来自 via之间歧义的构建错误消息IGroupsRepository。我知道这是不允许的,因为IRepository 继承了具有不同类型的相同通用接口(参见链接文章中的示例 5)。

  • 现在,由于我通过其他接口继承,是否有机会“覆盖”这些方法的名称,例如如下所示?

    IContactsRepository : ITypedRepository<Contact>
    {
        IEnumerable<Contact> GetContacts = ITypedRepository<Contact>.Get();
        ...
    }
    

这样,我可以IRepository.Getcontacts毫无歧义地访问它。是否有可能,或者是否有任何解决此问题的方法?

还有一个新问题,需要澄清:

  • 无论如何在控制器的调用中指定Get()我想要哪种方法?

  • 解决我最初的问题的最佳方法是什么 - 需要一个可以处理很多事情的存储库,而不仅仅是一种实体类型?

编辑:添加了类的代码示例Repository并从Controller.

4

3 回答 3

0

除了 CRUD 方法之外,您可能还会在 IGroupRepository 上有专门的方法:

IGroupRepository : ITypedRepository<Group>
{
    bool AddContactToGroup(Group g, Contact C);
}
于 2009-07-10T20:39:34.383 回答
0

添加具有明确名称的方法,这些方法调用显式实现:

public class EntitiesRepository : IRepository
{
    IEnumerable<Contact> IRepository<Contact>.Get()
    {
        // Return something
    }
    IEnumerable<Group> IRepository<Group>.Get()
    {
        // Return something
    }

    public IEnumerable<Contact> GetContacts()
    {
        return (this as IRepository<Contact>).Get();
    }

    public IEnumerable<Group> GetGroups()
    {
        return (this as IRepository<Group>).Get();
    }
}
于 2009-07-10T21:01:53.713 回答
0

我认为您不需要所有这些复杂性。将联系人添加到组时,您正在更改组。我假设您在 Group 类上有一组联系人。将联系人添加到群组后,您只需保存群组即可。那么你真的需要一个 AddContactToGroup 方法吗,只需要 Group 存储库接口上的 Save 方法就可以完成同样的工作。此外,您不需要为 Group 上的每个新关系属性都使用新方法。

对于Save方法本身的实现,如果使用NHibernate,只需调用相关方法即可。

于 2010-01-01T13:42:22.627 回答