0

我写了一个 MVC 4 应用程序。我有一些问题:

public class DatabaseContext<TEntity>: DbContext where TEntity: class
{
    ...
    public DbSet<TEntity> entity = {get; set;}
    ...
}
  1. 我想创建一个像这样的通用数据库上下文DatabaseContext,并将它用于我在数据库表中定义的所有实体。请写一个例子。
  2. 我现在不知道如何在 global.asax 中初始化通用上下文一次并在项目的任何必要部分中每次都使用它。请写一些例子。
4

2 回答 2

1

在我看来,您正在实施的是存储库模式

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

现在您的存储库将自动注入到您的控制器中。

于 2013-11-11T22:02:01.207 回答
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();
于 2013-11-11T23:41:11.520 回答