我写了一个MVC 4应用程序。我有一些问题:
public class DatabaseContext<TEntity>: DbContext where TEntity: class
{
...
public DbSet<TEntity> entity = {get; set;}
...
}
DatabaseContext
这样的通用数据库上下文,并将其用于数据库表中定义的所有实体。
请写一个例子。 答案 0 :(得分:1)
在我看来,您正在实施的是Repository Pattern:
public interface IRepository<TEntity> where TEntity : class
{
IEnumerable<TEntity> GetAll();
TEntity GetById(Guid id);
}
防止让您的存储库继承自DbContext
,因为DbContext
是Unit of Work pattern的实现,而工作单元不是存储库(而是包含或管理多个存储库)。
您可以做的是让您的存储库在内部使用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;
}
}
<强>更新强>
由于我是依赖注入爱好者,我认为依赖注入是您问题的解决方案。由于我是the Simple Injector project的开发人员,我将向您展示如何使用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.
}
现在您的存储库将自动注入您的控制器。
答案 1 :(得分:0)
您是否有理由使用泛型类型参数创建DatabaseContext?您不会在一个地方实例化它,因为每个不同的DatabaseContext都是一个单独的.NET类型。
除非您严格遵守特定模式,否则我个人认为这种方法在具有多个集合的单个DatabaseContext中没有任何实际优势:
public class DatabaseContext: DbContext
{
public DbSet<SomeEntity> SomeEntities { get; set; }
public DbSet<OtherEntity> OtherEntities { get; set; }
}
...
myDatabaseContext.SomeEntities.GetAll();
myDatabaseContext.OtherEntities.GetAll();
// OR:
myDatabaseContext.Set<SomeEntity>().GetAll();
myDatabaseContext.Set<OtherEntity>().GetAll();