依赖注入


  与 Entity Framework 一样,在 .Net Core 项目中,你也可以将 EntityContext 注册到 IOC 容器中,这样的话,在受 IOC 管理的类中都可以通过构造函数进行注入。

  在 Startup.ConfigureServices 方法里,使用 IserviceCollection 的扩展方法 AddEntityContext,就可以将其注册为 Scoped 的对象。

namespace demo
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddFireasy(Configuration);
            services.AddEntityContext<DbContext>();
        }
    }
}

  AddEntityContext 方法还可以结合 IOC 容器的配置来实现更彻底的解耦。如 IOC 的配置如下:

  • .Net Framework 下的 app.config 或 web.config 文件
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <sectionGroup name="fireasy">
      <section name="containers" type="Fireasy.Common.Ioc.Configuration.ContainerConfigurationSectionHandler, Fireasy.Common"/>
    </sectionGroup>
  </configSections>
  <fireasy>
    <containers>
      <container>
        <registration
           serviceType="demo.Data.DbContext, demo">
        </registration>
      </container>
    </containers>
  </fireasy>
</configuration>
  • .Net Core 下的 appsettings.json 文件
{
   "fireasy": {
    "containers": {
      "settings": {
        "default": [
          {
            "serviceType": "demo.Data.DbContext, demo"
          }
        ]
      }
    }
  }
}

  在 Startup.ConfigureServices 方法里,AddEntityContext 可以不用指定泛型类型。

namespace demo
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddFireasy(Configuration).AddIoc();
            services.AddEntityContext();
        }
    }
}

  在控制器或其他类的构造函数里,你可以像使用其他接口或类一样将 EntityContext 注入进来。注意,使用 EntityContext 的类,也必须放在 IOC 容器里。

public class Service : IService, ITransientService
{
    private readonly DbContext _context;

    public Service(DbContext context)
    {
        _context = context;
    }

    public async Task<int> GetCountAsync()
    {
        return await _context.Orders.CountAsync();
    }
}

  EntityContext 的生命周期是 Scoped 它的销毁会在请求完成时自动进行,因此你不必考虑其 Dispose 的问题。另外,使用它的类,只能注册为 TransientScoped


💡 特别提醒

  在 .Net Core 中,new DbContext() 创建的实例中,IServiceProvider 用的是 Container,如果你想使其与 .Net Core 保持一致,DbContext 也必要使用注入。