【问题标题】:Using generic interface in the repository pattern在存储库模式中使用通用接口
【发布时间】:2012-02-04 15:05:51
【问题描述】:

我目前正在使用 EF 和存储库模式开发 MVC 3 应用程序。我创建了一个通用接口如下:

interface IGenericRepository<T>
{
}

还有一个抽象类如下:

abstract class GenericRepository<TContext ,T> : IGenericRepository<T>
    where TContext : DbContext, new()
{
}

之后,我的 repo 像这样继承它们:

interface ICardRepository : IGenericRepository<Card>
{
}

class CardRepository : GenericRepository<EfContext, Card>, 
    ICardRepository
{
}

使用 Unity,我像这样注册接口和类:

container.RegisterType<ICardRepository, CardRepository>();

现在的问题是:我可以使用 IGenericRepository 代替 ICardRepository 吗? 像这样:

container.RegisterType<IGenericRepository<Card>, CardRepository>();

理论上我可以,但由于我仍然不明白这种模式是如何工作的,我不太确定我是否没有破坏或遗漏某些东西。

【问题讨论】:

    标签: c# entity-framework dependency-injection unity-container


    【解决方案1】:

    一个可能的问题是现在您必须解决IGenericRepository&lt;Card&gt;,而不是ICardRepository

    这不起作用:

    var cardRepository = container.Resolve<ICardRepository>();
    

    相反,您必须这样做:

    var cardRepository = container.Resolve<IGenericRepository<Card>>();
    

    这也意味着如果你在做类似构造函数注入的事情,你就不能使用:

    public class SomethingDependentOnCardRepository
    {
        // The parameter type should be IGenericRepository<Card> instead,
        // if you are using Unity to resolve this dependency.
        public SomethingDependentOnCardRepository(ICardRepository cardRepository)
        {
           // code
        }
    }
    

    【讨论】:

    • 感谢您的回答。其实我很清楚这一点。关键是如果我使用这样的界面,我会以某种方式打破这种模式吗?例如(我知道情况并非如此)如果我使用通用接口,我可能会使测试变得更加困难。
    • 啊。我想不出任何潜在的问题。我唯一关心的是 ICardRepository 接口此时的用途是什么?还是会在此过程中删除?
    • 我想摆脱那个接口,而只使用通用接口 - 它可以让我免于创建具有不同名称的相同接口的大量副本,例如 ICardRepository、ITagRepository、ISomethingElseRepository,它们基本上是一样。
    • 如果您的存储库没有做任何事情,为什么您首先拥有它们? This is the latest 来自 Oren Eini(又名 Ayende Rahien)的一系列帖子,其中他反对存储库模式。谷歌会给你更多他的论点。
    • 无论他们做什么或不做什么都无所谓:) - 我需要知道我是否以某种方式打破了这种模式。实际上 IGenericRepository 有以下方法:GetSingle、GetAll、Add、Remove。我知道存储库是有争议的,但我必须坚持使用 EF,而且我必须在紧迫的时间内开发项目。稍后我可以以更好的方式对其进行更改,但现在我将坚持我已经(几乎)知道的内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-12
    • 1970-01-01
    • 2014-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多