Unity 中的单例每次调用上下文(Web 请求)

2024-02-23

几天前,我遇到了 ASP.Net 线程的问题。我希望每个网络请求都有一个单例对象。我实际上需要这个来完成我的工作单位。我想为每个 Web 请求实例化一个工作单元,以便身份映射在整个请求过程中都有效。这样我就可以使用 IoC 将我自己的 IUnitOfWork 透明地注入到我的存储库类中,并且我可以使用相同的实例来查询然后更新我的实体。

由于我使用的是Unity,所以我错误地使用了PerThreadLifeTimeManager。我很快意识到 ASP.Net 线程模型不支持我想要实现的目标。基本上它使用线程池并回收线程,这意味着我每个线程获得一个 UnitOfWork!然而,我想要的是每个网络请求一个工作单元。

一些谷歌搜索给了我这篇很棒的文章 http://dotnetslackers.com/Community/blogs/simoneb/archive/2006/08/21/The-ASP.NET-Singleton_2D00_per_2D00_Request-pattern.aspx。这正是我想要的;除了很容易实现的统一部分。

这是我对 PerCallContextLifeTimeManager 的统一实现:

public class PerCallContextLifeTimeManager : LifetimeManager
{
    private const string Key = "SingletonPerCallContext";

    public override object GetValue()
    {
        return CallContext.GetData(Key);
    }

    public override void SetValue(object newValue)
    {
        CallContext.SetData(Key, newValue);
    }

    public override void RemoveValue()
    {
    }
}

当然,我用它来注册我的工作单元,代码如下:

unityContainer
            .RegisterType<IUnitOfWork, MyDataContext>(
            new PerCallContextLifeTimeManager(),
            new InjectionConstructor());

希望它可以节省一些人的时间。


很好的解决方案,但是 LifetimeManager 的每个实例都应该使用唯一的键而不是常量:

private string _key = string.Format("PerCallContextLifeTimeManager_{0}", Guid.NewGuid());

否则,如果您向 PerCallContextLifeTimeManager 注册了多个对象,它们将共享相同的密钥来访问 CallContext,并且您将无法取回预期的对象。

还值得实现RemoveValue来确保对象被清理:

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

Unity 中的单例每次调用上下文(Web 请求) 的相关文章

随机推荐

  • 核心数据图像不会加载到 NSTableView 图像单元中

    在我的代码中 我将图像存储到我的核心数据模型中 工作正常 如果我将视图设置为具有 NSImageView 并将其数据绑定到 Controller Key selection 和 modelKeyPath myImagePath 则它可以工作
  • 如何通过htaccess在URL中添加index.php

    实际上我需要通过 htaccess 文件在我的应用程序 URL 中添加 index php 我的网址是这样的 http localhost 8080 myapp xyz abs html 我需要将其更改为 http localhost 80
  • 在 PHP 中检索相对 DOM 节点

    我想检索文档中下一个元素标签的数据 例如 我想找回 blockquote Content 1 blockquote 仅适用于每个不同的跨度 span span blockquote Content 1 blockquote blockquo
  • 如何生成一次性密码(OTP / HOTP)?

    我们决定通过为客户发布 iPhone Android 和 Blackberry 应用程序的方式开始进行多重身份验证 Think 的一次性密码系统 我知道如何生成一个独特的string通过使用基于帐户密钥加上设备序列号 或其他唯一标识符 的
  • FirstOrDefault 之后对象是否仍连接到列表?

    这是我的代码 Event thisEvent from i in list where i eventID eventID select i FirstOrDefault if thisEvent null thisEvent eventR
  • 命名空间“System.Data”中不存在类型或命名空间名称“OracleClient”

    当尝试运行我的代码时 我收到以下错误 CS0234 命名空间 System Data 中不存在类型或命名空间名称 OracleClient 是否缺少程序集引用 我已经引用了System Data dll and System Data Or
  • 无需安装即可替代 xuggler 进行视频编码? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在创建一个截屏 Java Web Start 应用程序 使用 xuggler 编码视频需要 在客户端
  • 如何去除凸度缺陷?

    我正在尝试从轮廓检测并精细定位图像中的某些对象 我得到的轮廓通常包含一些噪音 可能来自背景 我不知道 这些对象应该看起来类似于矩形或正方形 如下所示 我通过形状匹配得到了非常好的结果 cv matchShapes 来检测其中包含或不包含噪声
  • 使用自制程序和 Xcode 8.1.1 安装 Mongodb 失败

    跑步时brew install mongodb 我得到以下输出 Updating Homebrew mongodb A full installation of Xcode app 8 3 2 is required to compile
  • 单击按钮时以特殊顺序保存数据

    我创建了一个应用程序 用户可以在其中添加一些注释到特定的car 在我的例子中 用户必须能够添加评论并对汽车进行评分 const App gt const state setState useState visible false const
  • sveltekit 中的 SPA / SSR

    我有一个页面 categories 在里面load函数来自 categories page server js我通过加载类别data来自数据库作为 JSON 对象 我将它们显示在 categories page svelte作为一个列表 当
  • 关联词的邻近度

    假设我有一段大约一段时间的对话文本记录 1小时 我想知道哪些词彼此相邻 我将使用什么类型的统计技术来确定哪些单词聚集在一起以及它们彼此之间的接近程度如何 我怀疑某种聚类分析或主成分分析 要确定单词的邻近度 您必须构建一个图表 每个单词都是一
  • 找不到“RdlCompile”任务

    我正在尝试使用 rldc 文件进行编译和项目 但出现以下两个错误之一 无法从程序集 Microsoft ReportViewer Common Version 10 0 0 0 Culture neutral PublicKeyToken
  • Qt:使TableView的宽度适合内容的宽度

    我有一个窗口 其中包含QTableView which 栏目根据内容进行调整并且是宽度固定 The QTableView嵌套在一个QWidget依次嵌套在QScrollArea依次嵌套在tabbed QMdiArea哪一个是centralW
  • 如何在 GWT 中解析大数据 (XML)

    在我的 GWT 应用程序中 我从 REST 服务器检索 XML 数据 我正在使用 Piriti XML 解析器https code google com p piriti wiki Xml https code google com p p
  • 派生类型不会发布给 MassTransit 中的消费者

    我在发布派生类型的通用消息以及使用 MassTransit v2 8 0 调用处理程序时遇到问题 如果我发布一条类型的消息HtmlBlockNewMessage 消费者永远不会被调用 如果我发布一个ServiceBusMessage反对并改
  • 如何在 Xcode 5 中自动增加内部版本号[重复]

    这个问题在这里已经有答案了 我想知道 Xcode 5 是否提供了一个设置来自动计算项目导航器 身份 部分中 常规 下找到的内部版本号 但据我所知 您仍然需要使用 PlistBuddy 通过脚本来完成此操作 一种简单的解决方案是增加 Xcod
  • 如何在vb.net中的控件名称中连接变量整数

    现在我有一个数据库并提取该数据并将其显示为表单 我有一系列组框和单选按钮 在每个组框 groupbox1 groupbox2等 中有2个单选按钮 即rdbtn1Yes和rdbtn1No 然后它在下一个 Groupbox 中增加 1 现在我用
  • ReactNative 自定义端口支持 run-android 命令,McAfee 解决方法

    我正在尝试为 Windows 配置 React Native 以进行 Android 应用程序开发 但我无法使用端口 8081 因为我的笔记本电脑上的 McAfee 代理使用该端口 我能够在不同的端口 8090 上启动节点js服务器 rea
  • Unity 中的单例每次调用上下文(Web 请求)

    几天前 我遇到了 ASP Net 线程的问题 我希望每个网络请求都有一个单例对象 我实际上需要这个来完成我的工作单位 我想为每个 Web 请求实例化一个工作单元 以便身份映射在整个请求过程中都有效 这样我就可以使用 IoC 将我自己的 IU