【问题标题】:EF core in Web ApplicationWeb 应用程序中的 EF 核心
【发布时间】:2018-08-14 14:00:53
【问题描述】:

我不知道如何创建我的 DBContext。

我已经向 DI 注册了上下文:

services.AddDbContext<myContext>(options =>
            {
                options.UseSqlServer(Configuration.GetConnectionString("myContextConexionString "));
            });

现在我的问题很简单:如何从任何其他类方法访问?

MSDN 上除了“把它放在控制器构造函数上然后传递它”之外没有一个例子

编辑:

更准确地说(因为大多数人只是添加指向我已经阅读过的文档的链接):

这是我想使用 DBContext 的课程:

public class MYclass
{
    public void MyMethod()
    {
        //get DBcontext here
    }
}

【问题讨论】:

  • 例如this guide 是什么?
  • 看来你需要了解一下依赖注入。还有关注点分离。我会看看this video。值得花时间观看。
  • “经过 5 个多小时的研究”,其中不包括阅读任何文档和完成指南或示例,看起来。投票结束。教我基础知识 = 太宽泛了。
  • @TomTom 给我看一个链接(只有一个),上面有文档吗?我没有找到。所有这些都只是在控制器构造函数中添加上下文并传递它们。我的控制器中不需要这个。我只是想在需要的时候使用它
  • @Jurion 因为您不应该在 DI 配置类之外使用它。如果您希望我们能够帮助您,请edit您的问题并准确说出您想要实现的目标。

标签: c# asp.net ef-core-2.0


【解决方案1】:

我可以想到三种将 DbContext 放入其他类的方法。

  1. 您的控制器可以获取依赖项并将其传递给其他类。这不是很优雅,现在你的控制器必须包含很多样板来传递与它不直接相关的东西
  2. 使用服务定位器模式让类请求来自 IoC 容器的依赖项。这通常被认为是一种反模式
  3. 解决此问题的最简洁方法是让具有依赖关系的类由 IoC 容器实例化,以便它可以解析其依赖关系。

这是第三种方法的示例:

public class MyService : IMyService
{
    readonly MyDbContext _context;

    public MyService(MyDbContext context)
    {
        _context = context;
    }

    public void DoSomeWork()
    {
        //Now you can use the context here
    }
}

public interface IMyService
{
    void DoSomeWork();
}

public class MyController : Controller
{
    readonly IMyService _myService;;

    public MyController(IMyService myService)
    {
        _myService = myService;
    }
}

//In your ConfigureServices method
services.AddDbContext<myContext>(options =>
{
    options.UseSqlServer(Configuration.GetConnectionString("myContextConexionString"));
});

services.AddScoped<IMyService, MyService>();

通过遵循这种模式,您的控制器不需要了解 MyService 的依赖关系。它只需要通过它的构造函数请求一个 IMyService ,它就会收到一些需要完全解决的依赖项。 This video 更深入地讨论了这个模式。

【讨论】:

  • 它只会移动一个问题。它仍然需要在控制器构造函数上添加一些东西。它仍然不允许我在需要时获取我的 DBcontext。
  • @Jurion 不,它不会解决问题。它解决了它。请解释为什么您认为这种模式行不通。
  • @Jurion 在我的问题中,您似乎在哪里添加了任何上下文到控制器?仔细看。我不。控制器必须对IMyService 的实现方式一无所知。不要再扔路障了。你看了我的回答不到 10 分钟。仔细阅读。试试看。观看我提供的视频。多年来,我一直在专业地开发软件,Camilo 也是如此。这种模式会起作用。
  • @mason 谢谢你的帮助。我将选择选项 4:完全放弃 .net 核心并返回到 4.7,在那里我可以简单地“使用 new DbContext()”,它会自动使用正确的连接字符串。 PS:我会看视频的。看起来很有趣
  • @mason 是的。它更多的是集成测试。但根据我的经验,95% 的代码都是带有一些检查的 CRUD 操作(不是空名称,值必须是正数等)。也许我过早跳到 .net 核心(工具很糟糕,很多命令行,在 PC 上创建 10 个不同的框架版本,更新 nuget 包破坏了 Visual Studio 和 IIexpress。我花了一些时间来修复。)。我喜欢应用程序的启动时间。它似乎比 4.7 快很多。无论如何,非常感谢您的帮助。在删除所有内容并从头开始重新创建之前,我将在此停留一两天。
【解决方案2】:

您在 Startup 中执行的 AddDbContext 调用将上下文添加到 IoC 容器。然后,您可以要求 IoC 容器像这样将其注入您的控制器中

public class MyController : Controller
{
    private readonly myContext _context;
    public MyController(myContext context)
    {
        _context = context;
    }
}

然后使用它来访问您的数据。

【讨论】:

  • 问题是关于“任何其他类方法”。我假设 Jurion 有一些其他类需要使用 DbContext,而不是直接使用它的控制器。可能值得解释一下它是如何工作的。
  • 这不是问题所在。它与问题相反。问题是:在控制器外部使用它而不在控制器上添加上下文
  • 您也可以将其注入其他类,只要 IoC 容器创建这些类。
猜你喜欢
  • 2018-05-14
  • 2017-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多