zoukankan      html  css  js  c++  java
  • ASP.NET Core 使用 AutoFac 注入 DbContext

    DI 1.0 —— 通过 RegisterInstance 注入

    一开始,并不是很懂 AutoFac 的用法,又因为要使用特定的构造器和参数来初始化 DbContext,所以我想到的办法就是使用 RegisterInstance,代码如下:

    var optionsBuilder = new DbContextOptionsBuilder<BookListDbContext>();
    optionsBuilder.UseMySql(connectionString, b => b.MigrationsAssembly("BookList.Domain"));
    // SingleInstance 就是单例模式,现在想起来当时写的好智障
    containerBuilder.RegisterInstance(new BookListDbContext(optionsBuilder.Options)).SingleInstance();
    

    一开始在本地用 Swagger 一个一个的调试 api 的感觉还很好,没啥问题,后来前端同学把 js 加上,就会经常的出现 404。经过 debug 发现,是 DbContext 出现了冲突,多个请求同时访问同一个 DbContext 对象,造成异常,虽然不清楚为啥没有出现500而是404。

    DI 2.0 —— 添加 IDbContext 接口,通过 RegisterType 注入

    知道了问题所在,就想到了更换服务的生命周期设置,于是我在上面的代码的基础上直接把 SingleInstance 改成了 InstancePerLifetimeScope,但在运行时遇到了异常,原来 RegisterInstance 仅支持 SingleInstance。既然这样,那就接着换,于是我在网上发现了别人通过让自定义的 DbContext 实现一个 IDbContext 接口,进行依赖注入,代码如下:

    // ··········· 省略 IDbContext 的定义
    var optionsBuilder = new DbContextOptionsBuilder<BookListDbContext>();
    optionsBuilder.UseMySql(connectionString, b => b.MigrationsAssembly("BookList.Domain"));
    containerBuilder.RegisterType<MyDbContext>()
        .As<IDbContext>()
        .WithParam("options",optionsBuilder.Options)
        .InstancePerLifetimeScope();
    

    这样一来,我们就需要提取一个 IDbContext ,这个工作有些麻烦,但是在 ReSharper 的帮助下,简化了不少。然而,这个方法并没有生效,现在消费者类依赖 IDbContext 接口的一个实例,但是在实例化服务的时候却抛出了异常。。。
    很蛋疼,刚刚提取出来的接口白费了。

    DI 3.0 —— 使用 Register 方法

    其实这个是我根据 Intellisence 试出来的,代码如下:

    // 首先注册 options,供 DbContext 服务初始化使用
    containerBuilder.Register(c =>
    {
        var optionsBuilder = new DbContextOptionsBuilder<BookListDbContext>();
        optionsBuilder.UseMySql(connectionString, b => b
            .MigrationsAssembly("BookList.Domain"));
        return optionsBuilder.Options;
    }).InstancePerLifetimeScope();
    // 注册 DbContext
    containerBuilder.RegisterType<BookListDbContext>()
        .AsSelf()
        .InstancePerLifetimeScope();
    

    实验证明,这样注入 DbContext 是没有问题的

  • 相关阅读:
    LoadRunner FAQ
    LoadRunner下载文件脚本
    Loadrunner上传文件解决办法(大文件)
    LoadRunner中的IP欺骗的设置以及误区
    Loadrunner11在win7下录制脚本,ie打不开
    LoadRunner检查点实战
    设置Loadrunner负载机临时文件目录
    ArcGIS中国工具,版权声明,本人没有授权任何单位和个人销售,其他都是盗版,为了你个人和单位利益,请勿购买。 销售QQ:27652980,853740877,电话:18987281928,13108507190,qq群310964401
    勘测定界软件,增加平方米和公顷,小数进位面积不平,自动调平功能;不够线状扣除负面积自动处理功能 ​​​​
    arcgis 获得工具箱工具的个数
  • 原文地址:https://www.cnblogs.com/JacZhu/p/5869969.html
Copyright © 2011-2022 走看看