使我的 DbContext class 在控制器中无法访问的最佳方法是什么?

What is the best way to make my DbContext class inaccessible in the controllers?

我正在使用 ASP.NET 构建一个 Web 应用程序,我在一个解决方案中创建了两个独立的项目,其中一个是 ASP.NET 项目,另一个是 'Console Application' 称为数据层。在数据层中,我已将其与本地数据库连接(ADO.NET entity framework 数据库优先)。

我的问题是,我希望我的 DbContext class 在我的 ASP.NET 项目中的控制器中无法访问。目前它仍然可以通过 'using data layer' 到达。我的 ASP.NET 中有一个包含构建器 classes 的文件夹,它们可以访问 DbContext,我只希望构建器访问我的 DbContext。所以在我的控制器中,我只想使用我的构建器对 DbContext 做一些事情。

我想要的示例:

    public ActionResult Index() 
    {
         return View(new ExampleBuilder().GetListFromDb());
    }

而不是(这在我的项目中必须被禁止和不可访问):

private DbContext db = new DbContext();

public ActionResult Index() 
{
   return View(db.SomeModel.ToList());
}

有人对此有好的解决方案吗?

您可以使用以下项目结构

  • Web(取决于 Data.Repositories 和 Common)
  • Data.Repositories(取决于 Data.Model 和 Common)- 在这里您实现使用来自 Data.Model.
  • 的 EntityFramework 上下文的存储库
  • Data.Model(取决于 Common)- 将您的 EntityFramework 上下文 class 放在这里,但所有模型都应进入 Common 以使其可用于所有项目。
  • Common - 您的 EntityFramework 模型和其他任何需要在任何地方都可以访问的东西,例如异常,实用程序。

基本上你的存储库方法应该是这样的:

public Common.User GetUserByEmail(string email)
{
    using (var context = new Data.Model.MyContext())
    {
        return context.Users.FirstOrDefault(user => user.Email == email);
    }
}

您的网站没有对 Data.Model 的引用,它将无法直接使用您的上下文 class。它将必须通过存储库抽象层。