Web 应用程序中的 EF 核心

EF core in Web Application

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

我在 DI 注册了上下文:

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

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

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

编辑:

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

这是我的 class 我想使用 DBContext 的地方:

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

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

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

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

我可以想出三种方法让您的 DbContext 进入其他 classes。

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

这是第三种方法的示例:

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 更深入地研究了这个模式。