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

发布于 2025-01-02 14:50:58 字数 897 浏览 1 评论 0原文

我目前正在使用 EF 和存储库模式开发 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>();

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

I am currently developing an MVC 3 application with EF and the Repository pattern. I created a generic interface as follows:

interface IGenericRepository<T>
{
}

And an abstract class as follows:

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

After that my repo inherits both of them like this:

interface ICardRepository : IGenericRepository<Card>
{
}

and

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

With Unity I register the interface and the class like this:

container.RegisterType<ICardRepository, CardRepository>();

Now the question is: can I use IGenericRepository instead of ICardRepository?
Like this:

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

In theory I can, but as I still do not get how this pattern works I am not quite sure if I am not breaking or missing something.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

稚然 2025-01-09 14:50:58

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

One possible issue is now you will have to resolve IGenericRepository<Card>, instead of ICardRepository.

This will not work:

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

Instead you will have to do this:

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

This also means that if you are doing something like constructor injection, you can't use:

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
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文