c# - DryIoc - ASP.Net Core - 每个请求的范围上下文
问题描述
我想在我的应用程序(ASP.Net Core 2.2)中使用 DryIoc。我想在执行一个 API 服务的调用期间使用相同的服务实例。(在 Http 调用/作用域上下文期间)。如果它在 ASP.Net WebApi 中,我希望每个 http 上下文都有一个范围。在 DryIoc 文档中,可以将 AsyncExecutionFlowScopeContext 用于 WebApi。
但是,对于 ASP.Net Core,我并不真正了解如何使用和声明每个请求的范围。
我的代码基于此示例:https ://github.com/dadhi/DryIoc/tree/master/samples/DryIoc.AspNetCore.Sample
如果我尝试解析声明为 ScopeService (Reuse.Scoped) 的服务,我会遇到问题:无法从没有 Scope 的容器中解析 IScopedService IsResolutionCall。
供您参考,我的容器的声明就像示例中的一样:
public IServiceProvider ConfigureServices(IServiceCollection services)
{
services.AddMvc()
// Enables controllers to be resolved by DryIoc, OTHERWISE resolved by infrastructure
.AddControllersAsServices();
var container = new Container(rules => rules.With(
propertiesAndFields: request =>
request.ServiceType.Name.EndsWith("Controller")
? PropertiesAndFields.Properties()(request)
: null)
.WithCaptureContainerDisposeStackTrace());
Container = container;
return container.WithDependencyInjectionAdapter(services,
throwIfUnresolved: type => type.Name.EndsWith("Controller"))
// Your registrations are defined in CompositionRoot class
.ConfigureServiceProvider<CompositionRoot>();
}
对于注册:
public CompositionRoot(IRegistrator r)
{
r.Register<ISingletonService, SingletonService>(Reuse.Singleton);
r.Register<ITransientService, TransientService>(Reuse.Transient);
r.Register<IScopedService, ScopedService>(Reuse.Scoped);
}
如果我尝试在一项服务中执行此操作:
var myScopedServvie = Container.Resolve<IScopedService>();
我有一个例外:ContainerException: Unable to resolve IScopedService IsResolutionCall from Container without Scope with Rules with {CaptureContainerDisposeStackTrace} with Made={PropertiesAndFields=}
所以我的问题是:如何为我的 API 的每个请求打开一个范围?我可以看到一些测试:
(var scope = container.OpenScope())
...
但我不知道如何在我的应用程序中使用此代码。
谢谢你的帮助。
解决方案
Asp .Net Core 框架会根据每个 Web 请求自动打开一个范围,您无需费心。
如果要测试容器设置,则可以OpenScope
在相应的测试中手动进行,并从返回的范围内解析。
推荐阅读
- java - 使用 google unity firebase 保持登录状态
- solidity - 检查映射中是否存在键
- node.js - Nodejs访问本地网络上的共享文件夹,根目录问题
- django - 解决django模板不存在的问题
- vagrant - 如何指定在 Vagrant 中下载到 Virtualbox VM 的 salt 版本?
- java - java for循环性能差异
- python - np.angle 返回的相位不准确
- angular - 如何正确配置代理以在 Angular/Spring Boot 中发出发布请求
- python - 内存泄漏的生成器
- google-colaboratory - 如何在 Google Colab 中将 cuDNN 从 v8.0 降级到 v6.0?