Autofac InstancePerRequest范围 - 将范围实例重用于其他位置

时间:2017-12-05 13:08:14

标签: asp.net-mvc dependency-injection autofac

我在项目中使用Autofac作为依赖注入容器。我想使用InstancePerRequest范围,因为我不希望这些对象比请求更长久。

以下是我在网关类中使用的代码,我知道每个请求都会通过它。

        using (var scope = _container.BeginLifetimeScope(MatchingScopeLifetimeTags.RequestLifetimeScopeTag))
        {
            var service = scope.Resolve<MyTestService>();
            ...
        }

现在,在我的代码中,我找到了其他几个我需要解析MyTestService的类,目前正在使用消息No scope with a Tag matching 'AutofacWebRequest'导致异常。例外是因为我在container实例上调用了解析,而我应该在同一个scope实例上调用resolve,如上所示。

有人可以帮助我知道如何在我的代码中的那些位置访问相同的scope实例吗?我无法在所有课程中调用BeingLifetimeScope

1 个答案:

答案 0 :(得分:0)

不幸的是,我被困在手机上,我的房子正在改造,所以我没有电脑访问权限。因此,你会得到一个没有代码的简短答案,但它应该解开你。

你说你已经阅读了文档,所以你应该知道:

  • 使用块创建范围时,它与当前请求范围不同。
  • 如果您的服务是在现有请求中使用的,那么您应该只是将服务需要注入构造函数中,而不是使用作用域进行服务定位。
  • 如果您的服务未在现有请求中使用,那么您可以自行决定如何模拟服务请求。没有固定的方法可以解决这个问题,因为它是特定于应用程序的。
  • 如果需要请求范围的重点是获取每个请求注册的依赖项以解决请求之外的问题,那么您应该切换到每个生命周期范围的实例。
  • 如果必须 - 而且它是反模式,但如果必须 - 您可以在服务中添加构造函数参数,即ILifetimeScope。这将使当前范围注入。

您的问题无法告诉为什么您需要范围。我猜你可能有更好的方法来做你想要做的事情,但被困在我的手机上我无法真正扩展百万种可能性和方法来解决你所说的你需要做的事情。在未来的问题中,请考虑更多地解释上下文 - 为什么您的服务需要通过“网关”以及为什么您处于这种情况而不仅仅是注入构造函数参数并让Autofac集成完成繁重工作。

无论如何,这应该会让你失望。如果没有,您需要用其他背景澄清您的问题,也许其他人可以加入。