代码之家  ›  专栏  ›  技术社区  ›  Jurion

Web应用程序中的EF核心

  •  -2
  • Jurion  · 技术社区  · 6 年前

    我不知道如何创建dbContext。

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

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

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

    在外面的msdn上没有一个示例,请将其放到控制器构造函数上,然后传递给它。

    编辑:

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

    这是我要使用dbContext的类:

    public class MYclass
    {
        public void MyMethod()
        {
            //get DBcontext here
        }
    }
    
    2 回复  |  直到 6 年前
        1
  •  3
  •   mason    6 年前

    我可以想到三种方法来让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 更深入地研究这个模式。

        2
  •  -1
  •   Hans Kilian    6 年前

    这个 AddDbContext 在启动时调用you do将上下文添加到IOC容器中。然后您可以请求IOC容器将其注入控制器中,如下所示

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

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