【问题标题】:DryIoc - ASP.Net Core - Scope context per requestDryIoc - ASP.Net Core - 每个请求的范围上下文
【发布时间】:2019-01-04 10:03:49
【问题描述】:

我想在我的应用程序(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) 的服务,我会遇到问题:无法解析 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:无法解析 IScopedService IsResolutionCall 来自没有范围的容器 带有 {CaptureContainerDisposeStackTrace} 的规则 与 Made={PropertiesAndFields=}

所以我的问题是:如何为我的 API 的每个请求打开一个范围? 我可以看到一些测试:

(var scope = container.OpenScope())
...

但我不知道如何在我的应用程序中使用此代码。

感谢您的帮助。

【问题讨论】:

    标签: c# asp.net-core .net-core dryioc


    【解决方案1】:

    Asp .Net Core 框架会根据每个 Web 请求自动打开一个范围,您无需费心。

    如果你想测试容器设置,那么你可以在相应的测试中手动OpenScope,并从返回的范围内解析。

    【讨论】:

      猜你喜欢
      • 2022-06-28
      • 2020-09-24
      • 1970-01-01
      • 2019-02-12
      • 1970-01-01
      • 2019-07-18
      • 2016-09-16
      • 1970-01-01
      • 2013-11-24
      相关资源
      最近更新 更多