为了账号安全,请及时绑定邮箱和手机立即绑定

Web 应用程序中的 EF 核心

Web 应用程序中的 EF 核心

C#
aluckdog 2021-11-28 16:17:10
我不知道如何创建我的 DBContext。我在 DI 注册了上下文:services.AddDbContext<myContext>(options =>            {                options.UseSqlServer(Configuration.GetConnectionString("myContextConexionString "));            });现在我的问题很简单:如何从任何其他类方法访问?MSDN 上没有一个单独的例子“把它放在控制器构造函数上,然后把它传递出去”编辑 :更准确地说(因为大多数人只是添加指向我已经阅读过的文档的链接):这是我想使用 DBContext 的班级:public class MYclass{    public void MyMethod()    {        //get DBcontext here    }}
查看完整描述

2 回答

?
慕森卡

TA贡献1806条经验 获得超8个赞

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

  1. 您的控制器可以获取依赖项并将其传递给其他类。这不是很优雅,现在你的控制器必须包含很多样板来传递与它没有直接关系的东西

  2. 使用服务定位器模式让类从 IoC 容器请求依赖项。这通常被认为是一种反模式

  3. 解决这个问题的最简洁的方法是让 IoC 容器实例化具有依赖项的类,以便它可以解析其依赖项。

以下是第 3 种方法的示例:

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,它就会收到一些已经完全解决所有依赖关系的东西。该视频更深入地介绍了这种模式。


查看完整回答
反对 回复 2021-11-28
?
守着一只汪

TA贡献1872条经验 获得超3个赞

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


public class MyController : Controller

{

    private readonly myContext _context;

    public MyController(myContext context)

    {

        _context = context;

    }

}

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


查看完整回答
反对 回复 2021-11-28
  • 2 回答
  • 0 关注
  • 253 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信