ASP.NET Core中的EF Core DbContext池化
在将Simple Injector集成到ASP.NET Core中时,您可以将框架和第三方组件保留在.NET Core配置系统中。这意味着启用Entity Framework Core上下文池化与Microsoft的文档完全一致:
services.AddDbContextPool<BloggingContext>(
options => options.UseSqlServer(connectionString));
由于Simple Injector 不替换内置配置系统, 因此您需要指示 Simple Injector 自动从 .NET Core 配置系统中加载缺失的注册信息(例如您的 DbContext
)。这可以通过使用AddSimpleInjector
和UseSimpleInjector
扩展方法来实现,如下所示。
private SimpleInjector.Container container;
public void ConfigureServices(IServiceCollection services)
{
...
services.AddDbContextPool<BloggingContext>(
options => options.UseSqlServer(connectionString));
services.AddSimpleInjector(container, options =>
{
options.AddAspNetCore();
});
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseSimpleInjector(container);
container.Verify();
...
}
使用这个设置,BloggingContext
可以被注入到从Simple Injector解析出的任何组件中,而BloggingContext
则由Entity Framework进行池化。例如:
public class CommentIsNoSpamValidator : IValidator<PostComment>
{
private readonly BloggingContext context;
public CommentIsNoSpamValidator(BloggingContext context)
{
this.context = context;
}
public IEnumerable<ValidationResult> Validate(PostComment command)
{
}
}
在.NET(Core)控制台应用程序中使用EF Core DbContext池
当涉及在.NET Core控制台应用程序中使用Entity Framework Core上下文池时,解决方案将非常相似,但是您需要进行一些设置:
public void Main()
{
var container = new Container();
var services = new ServiceCollection();
services.AddDbContextPool<BloggingContext>(
options => options.UseSqlServer(connectionString));
services.AddSimpleInjector(container);
services
.BuildServiceProvider(validateScopes: true)
.UseSimpleInjector(container);
container.Verify();
using (AsyncScopedLifestyle.BeginScope(container))
{
var service = container.GetInstance<MainService>();
service.DoAwesomeStuff();
}
}
因此,DbContext的生命周期由MS.DI范围管理,但该范围由Simple Injector的范围管理。
在库中使用EF Core DbContext池
如果您正在构建一个库,即非启动项目,请停止当前操作。只有应用程序的启动程序集应该有Composition Root,且仅应该使用DI容器(如Simple Injector或MS.DI的ServiceCollection
)的Composition Root。应用程序中的所有其他库都应该对容器的(可能)存在保持无知。
CrossWire<EfQueries>()
或使用AutoCrossWireAspNetComponents
来交叉连接你的DbContext
,那么你将免费获得池化行为。 - Steven