c# - 在存储库模式中使用通用接口(interface)

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

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

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 中,我像这样注册接口(interface)和类:

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>>();

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

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
    }
}

关于c# - 在存储库模式中使用通用接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9141796/

相关文章:

c# - 寻找一些 UI 线程和工作线程教程

c# - 在 IEquatable 上重写等于

c# - JavaScript DI/IoC 等效于静态类型语言的标准 DI 模式

dependency-injection - 来自 Autofac 模块的 Net Core : access to appsettings. json 值

c# - 多线程设计模式

c# - 实现 IValidatableObject 时 ValidationContext 的目的是什么

sql - 唯一列约束是否会影响 SQL Server 中 INSERT 操作的性能

java - 如何从静态内部类构造函数创建 Spring bean?

c# - 将 iTextSharp.text.Image 转换回 System.Drawing.Image

c# - EF 6 - 代码第一个无效的一对一外键关系