用作 ServiceStack 的 IoC 时在 autofac 中配置生命周期范围

2024-05-15

我目前正在使用 AutoFac 作为我们的 ServiceStack Web 服务应用程序的 DI 容器。我能够配置接线和所有内容,但在阅读了有关范围的部分后,我不知道在注册我的组件时最好使用哪个范围。在我们的特定情况下,我认为 PerHttpRequest 范围就可以了,因为(如果我错了,请纠正我)我希望在请求结束后立即处理依赖项。

我的问题是,如何在容器中设置它?我似乎无法在 autofac 中包含的方法中找到“PerHttpRequest”生命周期范围。我也不确定 ServiceStack 是否会在幕后自动为我执行此操作。

我在 .Net 4 上的 ServiceStack 3.9.35 上使用 Autofac 3.0.1(作为常规 ASP 主机运行,而不是 MVC)。我也在使用所描述的类here https://github.com/ServiceStack/ServiceStack/wiki/The-IoC-container作为 IContainer 适配器。


我想避免依赖 MVC 的开销,因此第一个答案对我来说不太有效。

相反,我使用 Funq 注册 PerRequest ILifetimeScope,并在解决依赖关系之前解析 ConatinerAdaptor 中的 ILifetimeScope。

public class AutofacLifetimeScopeIocAdapter : IContainerAdapter
{
    private readonly Container _requestContainer;

    public AutofacLifetimeScopeIocAdapter(Funq.Container requestContainer)
    {
        _requestContainer = requestContainer;
    }


    public T Resolve<T>()
    {
        var currentContainer = _requestContainer.Resolve<ILifetimeScope>();

        return currentContainer.Resolve<T>();
    }

    public T TryResolve<T>()
    {
        var currentContainer = _requestContainer.Resolve<ILifetimeScope>();

        T result;

        if (currentContainer.TryResolve<T>(out result))
        {
            return result;
        }

        return default(T);
    }

}

然后用这个初始化

_autofacContainerRoot = builder.Build();
        IContainerAdapter adapter = new AutofacLifetimeScopeIocAdapter(container);

        container.Register<ILifetimeScope>((c) => _autofacContainerRoot.BeginLifetimeScope())
            .ReusedWithin(ReuseScope.Request);

        container.Adapter = adapter;

然后清理

public override void OnEndRequest()
    {
        var currentContainer = _container.Resolve<ILifetimeScope>();
        currentContainer.Dispose();

        base.OnEndRequest();
    } 

这似乎符合 Autofac 的要求 - SingleInstance、InstancePerDependency,以及现在的 InstancePerLifetimeScope(即 perRequest)。

HostContext.Instance.Items 集合上的 Mythz 响应可能可用于消除对

var currentContainer = _container.Resolve<ILifetimeScope>();

分辨率,这应该会提高性能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用作 ServiceStack 的 IoC 时在 autofac 中配置生命周期范围 的相关文章

随机推荐

  • 解决方案文件的修改权限

    我有用VS2005开发的项目解决方案 它绑定到 TFS Team Foundation Server 我想将解决方案转换为 VS2008 版本 保持绑定不变 但是在转换时出现错误 错误信息 解决方案文件 C abc abc sln 无法转换
  • Android Studio 模拟器未找到符号:_pwritev

    上次更新 Android 模拟器后 我无法启动任何虚拟设备 即使我创建了一个新的 模拟器显示几秒钟 然后出现错误 并且 macOS 在问题报告中显示 qemu system x86 64 意外退出 Dyld Error Message Sy
  • 带点 (.) 的 Spring MVC @PathVariable 被截断

    这是问题的延续Spring MVC PathVariable 被截断 https stackoverflow com questions 3526523 spring mvc pathvariable getting truncated S
  • IE 10 Javascript 错误未显示[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我刚刚将浏览器IE8升级到IE10 在 IE8 中任何java script发生错误 它显示在状态栏中 但是IE10错误未显示在状态栏中
  • 使用 Qt 上的看门狗更改 QLabel 文本

    我正在尝试做什么 每当在受监视的文件夹中创建新文件 使用 Watchdog 时 更改 QLabel 文本 Problem 使用以下代码创建新文件时 QLabel 文本不会更新 但成功调试打印到控制台 class MainWindow QtW
  • 如何在 Ionic 3 中调整图像大小而不降低质量和目标宽度和高度?

    我想减小相机 API 拍摄的图像的大小 但质量降低不好 最好的办法是降低分辨率 但我不想对所有图像使用目标宽度和高度 例如 我希望图像宽度为 1280 图像高度按其比例自动变化 但在 API 中我应该使用精确的宽度和高度 如何通过图像比例更
  • windows关闭tomcat后保持端口锁定

    我遇到了一个问题 该问题发生在不同站点的 3 台不同服务器上 问题是 当我关闭 Windows 服务器上的 Tomcat 7 和 8 5 版本 服务并尝试重新启动该服务后 该服务将无法启动 因为 tomcat 认为端口仍在使用中 以下是错误
  • 从 Ruby 中的 DateTime 变量获取时间

    我在 ruby 中工作 我有一个包含数据库中今天的日期时间的对象 我只想要时间截断数据 我怎样才能得到那个 Try 日期时间 strftime http www ruby doc org stdlib 1 9 3 libdoc date r
  • 为什么 System.Math 有 Sin、Cos 等外部方法?

    MethodImpl MethodImplOptions InternalCall public static extern double Sin double a 其原因何在 MethodImplOptions InternalCall表
  • 必填字段验证器中的数字验证

    是否可以将数字验证放入 asp net 文本框中的必填字段验证器中 您应该使用比较验证器 http msdn microsoft com en us library system web ui webcontrols comparevali
  • 自动过滤/排序列表框项目 (Windows Phone)

    我想确保添加到列表框中的项目根据每个项目的序列号按升序排序 例如 1 项目 2 项目 4 项目 3 项目应根据其编号自动排序 1 2 3 10 这是 C 源代码 namespace XeroQuiz public partial class
  • 如何使用 webpack 正确捆绑 vscode 扩展

    我遇到的问题是当我跑步时vsce package我仍然明白This extension consists of 3587 separate files For performance reasons you should bundle yo
  • 调试器异常错误和内存超调

    我尝试运行以下代码 但它显示有关内存地址的错误 并显示一条消息 循环后 n 可能未定义 请看一看 var n max integer n integer r R1 f h0 Array of Real const h 0 00889 nip
  • 使用 mosca MQTT 的请求响应模式

    有没有办法使用 mosca MQTT 实现请求响应模式 以 检查客户端的回复 如果在预期时间内未收到预期回复 则重新发布 我相信这在 Mqtt 5 中是可能的 但截至目前 我必须使用 QoS 1 的 Mosca 代理 支持直到 Mqtt 3
  • 错误 11 秒后等待 Protractor 与页面同步超时

    我的量角器测试有问题 我的角度应用程序使用 timeout 不断从服务器轮询某些内容 不幸的是 当我运行测试时 这会导致以下错误消息 There was a webdriver error Error Timed out waiting f
  • Javascript 放大/缩小到鼠标 x/y 坐标

    我设法让鼠标拖动来滚动div 但是用鼠标放大 缩小不完整 它有效 但我希望鼠标指针将图像保持在该位置并同时缩放它 如下所示 我需要使用scrollBy 将滚动返回到缩放之前的上一点 有人知道该怎么做吗 这是某人制作的小提琴https jsf
  • 如何在 Android 中启用高速蓝牙(3.0+HS 或 4.0)?

    所以我在两部蓝牙 4 0 Android 手机上有一个 BT 客户端和一个服务器应用程序 服务器等待连接通过 BluetoothServerSocket serverSocket mBluetoothAdapter listenUsingR
  • Python 中的错误? threading.Thread.start() 并不总是返回

    我有一个很小的 Python 脚本 在我看来 threading Thread start 表现出意外 因为它不会立即返回 在线程内我想调用一个方法boost python基于对象 不会立即返回 为此 我将对象 方法包装如下 import
  • 如何使用 bash 显示具有两个子文件夹的文件夹?

    我通过 Cygwin 使用 bash 我有一个大文件夹 a 有很多子文件夹 b 这些子文件夹各有一个或两个子文件夹 c 我想找到所有有两个子文件夹 c 的子文件夹 b 并输出它们 结构如下 a b1 c1 b2 c1 c2 b3 c1 c2
  • 用作 ServiceStack 的 IoC 时在 autofac 中配置生命周期范围

    我目前正在使用 AutoFac 作为我们的 ServiceStack Web 服务应用程序的 DI 容器 我能够配置接线和所有内容 但在阅读了有关范围的部分后 我不知道在注册我的组件时最好使用哪个范围 在我们的特定情况下 我认为 PerHt