解决IEnumerable <service>时与Autofac无关的作用域

时间:2018-08-09 15:44:12

标签: autofac

我收集了一些服务,这些服务可以通过以下方式解决:

//other scope, such as default per http request in aspnet core

// new scope is created which is not part of web request scope
using (var scope = container.BeginLifetimeScope())
{
   var services = scope.Resolve<IEnumerable<MyService>>();
}

但是问题是,作用域在所有Enumerable项之间共享,如何解决它们,以便使每个项都获得新的作用域?

1 个答案:

答案 0 :(得分:0)

执行此操作有两个步骤。您需要将依赖项注册为每个生命周期作用域的实例,然后需要创建一个嵌套作用域并使用它来解决依赖项。

public class MyModule : Autofac.Module
{
    protected override void Load(ContainerBuilder builder)
    {
        builder.RegisterType<MyService1>(ThisAssembly)
            .As<MyService>
            .InstancePerLifetimeScope();

        builder.RegisterType<MyService2>(ThisAssembly)
            .As<MyService>
            .InstancePerLifetimeScope();

        builder.RegisterType<MyService3>(ThisAssembly)
            .As<MyService>
            .InstancePerLifetimeScope();

    }
}

然后,您应该能够正确解析嵌套作用域中的新实例,如下所示:

using (var scope = container.BeginLifetimeScope())
{
   var services = scope.Resolve<IEnumerable<MyService>>();
}