依赖注入
与 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 的问题。另外,使用它的类,只能注册为 Transient
或 Scoped
。
💡 特别提醒
在 .Net Core 中,new DbContext() 创建的实例中,IServiceProvider
用的是 Container
,如果你想使其与 .Net Core 保持一致,DbContext
也必要使用注入。