在我看来,您正在实施的是存储库模式:
public interface IRepository<TEntity> where TEntity : class
{
IEnumerable<TEntity> GetAll();
TEntity GetById(Guid id);
}
防止让您的存储库继承自DbContext
,因为它是工作单元模式DbContext
的实现,并且工作单元不是存储库(而是包含或管理多个存储库)。
您可以做的是让您的存储库在DbContext
内部使用:
public class Repository<TEntity> : IRepository<TEntity>
{
private readonly DbContext context;
public Repository(DbContext context)
{
this.context = context;
}
public IEnumerable<TEntity> GetAll()
{
return this.context.Set<TEntity>();
}
public TEntity GetById(Guid id)
{
var entity = this.context.Set<Entity>().Find(id);
if (entity == null) throw new KeyNotFoundException(
typeof(TEntity).Name + " with id " + id + " not found);
return entity;
}
}
更新
由于我是一个依赖注入爱好者,我认为依赖注入是解决您问题的方法。由于我是Simple Injector 项目的开发人员,我将向您展示如何使用 Simple Injector 进行此操作:
第 1 步:将Simple Injector MVC Integration Quick Start NuGet 包安装到您的 MVC 项目中(我假设您知道如何安装 NuGet 包)。
第 2 步:编译您的项目。您将SimpleInjectorInitializer
在包刚刚添加的类中收到编译器错误。这是您必须进行注册的线路。您可以删除此#error 行。
第 3 步:将命名空间添加SimpleInjector.Extensions
到文件顶部SimpleInjectorInitializer
:
using SimpleInjector.Extensions;
第 4 步:在InitializeContainer
方法中进行以下注册:
container.RegisterOpenGeneric(typeof(IRepository<>), typeof(Repository<>));
container.RegisterPerWebRequest<DbContext>(
() => new DbContext("Your connection string here"));
第 5 步:将IRepository<T>
依赖项添加到您的控制器:
public class CustomerController : Controller
{
private readonly IRepository<Customer> customerRepository;
public CustomerController(IRepository<Customer> customerRepository)
{
this.customerRepository = customerRepository;
}
// controller methods here.
}
现在您的存储库将自动注入到您的控制器中。