DryIoc-ASP.Net Core-每个请求的范围上下文

时间:2019-01-04 10:03:50

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

我想在我的应用程序(ASP.Net Core 2.2)中使用DryIoc。 我想在执行一个API服务的调用期间使用相同的服务实例。 (在Http调用期间/作用域上下文中)。 如果它位于ASP.Net WebApi中,则我希望每个http上下文都有一个作用域。在DryIoc文档中,可以将AsyncExecutionFlowScopeContext用于WebApi。

但是,使用ASP.Net Core,我真的不了解如何根据请求使用和声明作用域。

我的代码基于以下示例:https://www.dqs-holding.com/en/contact-us/contact-form-general-inquiry/

如果我尝试解析声明为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())
...

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

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

Asp .Net Core框架会为每个Web请求自动打开一个作用域,而您无需打扰。

如果要测试容器设置,则可以在相应的测试中手动OpenScope,然后从返回的范围中进行解析。