在存储库模式中使用通用接口

本文关键字:接口 存储 模式 | 更新日期: 2023-09-27 18:22:23

我目前正在开发一个带有EF和Repository模式的MVC 3应用程序。我创建了一个通用接口如下:

interface IGenericRepository<T>
{
}

和一个抽象类如下:

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

在那之后,我的回购像这样继承了它们:

interface ICardRepository : IGenericRepository<Card>
{
}

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

使用Unity,我注册接口和类,如下所示:

container.RegisterType<ICardRepository, CardRepository>();

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

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

理论上我可以,但由于我仍然不知道这种模式是如何运作的,我不太确定我是否打破或错过了什么。

在存储库模式中使用通用接口

一个可能的问题是,现在必须解决IGenericRepository<Card>,而不是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
    }
}