Ninject 和静态类 - 如何?

2023-11-24

我有一个静态类,我需要向其中注入一些实例。静态类可以有静态构造函数,但它必须是无参数的。那么,我该如何向其中注入一些东西呢?

我不想创建一个单身人士。我希望有一个静态类,并且它的方法之一对应该注入的实例进行操作。下面是我需要的示例:

public static class AuthenticationHelper
{
    // Fields.
    private static object _lock = new object();
    private static readonly UserBusiness _userBusiness; // <-- this field needs to be injected.

    // Public properties.
    public static User CurrentUser
    {
        get
        {
            if (IsAuthenticated)
            {
                User user = (User)Context.Session[SessionKeys.CURRENT_USER];

                if (user == null)
                {
                    lock (_lock)
                    {
                        if (user == null)
                        {
                            user = _userBusiness.Find(CurrentUserId);
                            Context.Session[SessionKeys.CURRENT_USER] = user;
                        }
                    }
                }

                return user;
            }

            return null;
        }
    }
    public static int CurrentUserId { get; /* implementation omitted for brevity */ }
    public static bool IsAuthenticated { get; /* implementation omitted for brevity */ }
}

背景信息:这是一个 MVC4 应用程序,所以我使用 ninject.mvc3 插件。

PS:我看到了一些有关 Ninject 和静态方法的问题,但它们似乎都没有解决这样的问题。


不要这样做。不要使用需要自己的依赖项的静态类。这使得测试变得更加困难,并且其他类型依赖于此AuthenticationHelper将无法将其包含在构造函数中,这意味着它们隐藏了依赖它的事实。

相反,只需做你一直会做的事情:AuthenticationHelper非静态,实现一个IAuthenticationHelper接口并通过其公共构造函数注入所有依赖项。

但是,如果您坚持保持该类静态(这又是一个非常糟糕的主意),请创建一个静态Initialize(UserBusiness userBusiness)方法,并在应用程序的启动路径中调用该方法。你不能让你的 DI 容器调用这个静态方法。他们不允许,因为 1. 这是一个坏主意,2. 这样的静态方法只需要调用一次,所以让你的容器为你自动连接它并没有真正的帮助。

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

Ninject 和静态类 - 如何? 的相关文章

  • 为什么libc++的shared_ptr实现使用完整内存屏障而不是宽松内存屏障?

    在boost的实现中shared ptr 它用放松内存排序以增加其引用计数 https github com boostorg smart ptr blob master include boost smart ptr detail sp
  • OpenCv读/写视频色差

    我试图简单地使用 openCV 打开视频 处理帧并将处理后的帧写入新的视频文件 我的问题是 即使我根本不处理帧 只是打开视频 使用 VideoCapture 读取帧并使用 VideoWriter 将它们写入新文件 输出文件看起来比输入更 绿
  • 迭代变量并查找特定类型实例的技术

    我想迭代进程中内存中的变量 通过插件动态加载 并查找特定类型的实例 以前我可以找到特定类型 或内存中的所有类型 我可以创建类型的实例 我可以获取作为不同类型的字段包含的实例 但我无论如何都不知道只是 搜索 特定类型的实例 一种方法是使用 W
  • 32 位应用程序的特征最大矩阵大小

    所以 我正在寻找Eigen http eigen tuxfamily org index php title Main Page当我尝试声明大于 10000x10000 的矩阵时 包崩溃 我需要声明一个像这样的矩阵 可靠地大约有 13000
  • C++:重写已弃用的虚拟方法时出现弃用警告

    我有一个纯虚拟类 它有一个纯虚拟方法 应该是const 但不幸的是不是 该接口位于库中 并且该类由单独项目中的其他几个类继承 我正在尝试使用这个方法const不会破坏兼容性 至少在一段时间内 但我找不到在非常量方法重载时产生警告的方法 以下
  • JSON 数组到 C# 列表

    如何将这个简单的 JSON 字符串反序列化为 C 中的列表 on4ThnU7 n71YZYVKD CVfSpM2W 10kQotV 这样 List
  • C++ 异步线程同时运行

    我是 C 11 中线程的新手 我有两个线程 我想让它们同时启动 我可以想到两种方法 如下 然而 似乎它们都没有按照我的预期工作 他们在启动另一个线程之前启动一个线程 任何提示将不胜感激 另一个问题是我正在研究线程队列 所以我会有两个消费者和
  • 访问者和模板化虚拟方法

    在一个典型的实现中Visitor模式 该类必须考虑基类的所有变体 后代 在许多情况下 访问者中的相同方法内容应用于不同的方法 在这种情况下 模板化的虚拟方法是理想的选择 但目前这是不允许的 那么 模板化方法可以用来解析父类的虚方法吗 鉴于
  • 检查算术运算中的溢出情况[重复]

    这个问题在这里已经有答案了 可能的重复 检测 C C 中整数溢出的最佳方法 https stackoverflow com questions 199333 best way to detect integer overflow in c
  • 如何从网站下载 .EXE 文件?

    我正在编写一个应用程序 需要从网站下载 exe 文件 我正在使用 Visual Studio Express 2008 我正在使用以下代码 private void button1 Click object sender EventArgs
  • 如何将“外部模板”与由同一类中的模板化成员使用的嵌套类一起使用?

    首先 一些背景信息 我尝试以 Herb Sutter 在他的解决方案中介绍的方式使用 Pimpl 习语 得到了 101 http herbsutter com gotw 101 这在头文件中看起来像这样 include pimpl h h
  • 在 2D 中将一个点旋转另一个点

    我想知道当一个点相对于另一个点旋转一定角度时如何计算出新的坐标 我有一个块箭头 想要将其相对于箭头底部中间的点旋转角度 theta 这是允许我在两个屏幕控件之间绘制多边形所必需的 我无法使用和旋转图像 从我到目前为止所考虑的情况来看 使问题
  • 通过 NHibernate 进行查询,无需 N+1 - 包含示例

    我有一个 N 1 问题 我不知道如何解决它 可以在这个问题的底部找到完全可重复的样本 因此 如果您愿意 请创建数据库 设置 NUnit 测试和所有附带的类 并尝试在本地消除 N 1 这是我遇到的真实问题的匿名版本 众所周知 这段代码对于帮助
  • 将构建日期放入“关于”框中

    我有一个带有 关于 框的 C WinForms 应用程序 我使用以下方法将版本号放入 关于 框中 FileVersionInfo GetVersionInfo Assembly GetExecutingAssembly Location F
  • 如何一步步遍历目录树?

    我发现了很多关于遍历目录树的示例 但我需要一些不同的东西 我需要一个带有某种方法的类 每次调用都会从目录返回一个文件 并逐渐遍历目录树 请问我该怎么做 我正在使用函数 FindFirstFile FindNextFile 和 FindClo
  • 运算符“==”不能应用于“int”和“string”类型的操作数

    我正在编写一个程序 我想到了一个数字 然后计算机猜测了它 我一边尝试一边测试它 但我不断收到不应该出现的错误 错误是主题标题 我使用 Int Parse 来转换我的字符串 但我不知道为什么会收到错误 我知道它说 不能与整数一起使用 但我在网
  • 使用 C# 从 DateTime 获取日期

    愚蠢的问题 给定日期时间中的日期 我知道它是星期二 例如我如何知道它的 tue 2 和 mon 1 等 Thanks 您正在寻找星期几 http msdn microsoft com en us library system datetim
  • WinRT 定时注销

    我正在开发一个 WinRT 应用程序 要求之一是应用程序应具有 定时注销 功能 这意味着在任何屏幕上 如果应用程序空闲了 10 分钟 应用程序应该注销并导航回主屏幕 显然 执行此操作的强力方法是在每个页面的每个网格上连接指针按下事件 并在触
  • 带重定向标准流的 C# + telnet 进程立即退出

    我正在尝试用 C 做一个 脚本化 telnet 项目 有点类似于Tcl期望 http expect nist gov 我需要为其启动 telnet 进程并重定向 和处理 其 stdin stdout 流 问题是 生成的 telnet 进程在
  • 匿名结构体作为返回类型

    下面的代码编译得很好VC 19 00 23506 http rextester com GMUP11493 标志 Wall WX Za 与VC 19 10 25109 0 标志 Wall WX Za permissive 这可以在以下位置检

随机推荐

  • Linq 中的分层数据 - 选项和性能

    我有一些分层数据 每个条目都有一个 id 和一个 可为空 父条目 id 我想检索树中给定条目下的所有条目 这是在 SQL Server 2005 数据库中 我正在 C 3 5 中使用 LINQ to SQL 查询它 LINQ to SQL
  • 突出显示所有字段的匹配结果

    我希望突出显示匹配的结果 如果我提到字段名称并且它返回突出显示的文本 这对我有用 但是如果我将该字段指定为 all 它不会返回任何值 这对我有用 curl XGET http localhost 9200 my index my type
  • 如何使用 NSCoder 在 swift 中对枚举进行编码?

    背景 我正在尝试使用 NSCoding 协议对字符串样式枚举进行编码 但在与字符串之间转换和返回时遇到错误 我在解码和编码时遇到以下错误 字符串无法转换为 Stage 额外参数 ForKey 在调用中 Code enum Stage Str
  • 克利翁和 CMake。如何添加库(*.so)

    我正在尝试在 Clion IDE 中编写 c c 代码 我需要在我的项目中添加一些共享库 此时 我只想运行主函数 它将添加我的外部库 libAPIenergy so 具有的所有函数 我尝试了该论坛的一些解决方案 但没有一个有帮助 下面我将提
  • 在圆形图像视图中显示时图像被拉伸

    下面是我的 RoundedImageView 类 它扩展了 ImageView public class RoundedImageView extends ImageView public RoundedImageView Context
  • 突出显示 NSToolbarItems

    我想突出显示所选内容NSToolbarItem就像例如在 Adium 中 参见屏幕截图 突出显示http a2 s3 p quickshareit com files screenshot b28b67ba9411513d6 png 有简单
  • 如何将 Firestore 中的地图数组转换为 Dart 地图列表

    我正在尝试使用 Flutter 和 Firestore 构建一个应用程序 但我对必须将数据从 Firestore 实现为 Dart 语言的方式感到困惑 所以问题是我的 Firestore 中有一个地图数组 其中的每个元素该数组代表这样的地图
  • “左值”和“右值”的命名背后的原因是什么?

    C C 中 左值 和 右值 的命名背后的原因是什么 标准中提到了这一点 左值 历史上如此称呼 因为左值可能出现在赋值表达式的左侧 右值 历史上如此称呼 因为右值可以出现在赋值表达式的右侧 也就是说 左值是您可以分配给的东西 右值是您可以从中
  • 适用于 Java 的免费/开源测试生成器? [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 Java 是否有任何库可以为现有代码生成单元测试或单元测试框架 我正在寻找类似的东西验算师 理想情况下 它会生成遵循 JUnit4 或 TestNG 约定的代码 看起来像Agitar
  • 无法写入 JSON:JsonObject;嵌套异常是 com.fasterxml.jackson.databind.JsonMappingException: JsonObject

    春季启动2 5 PostMapping cart product public Response addProduct RequestBody Map
  • 暂停 getUserMedia 返回的流

    我已将 getUserMedia 返回的流引导到
  • 通过 POP3 自动检查退回的电子邮件? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 谁能推荐可以检查退回邮件以及退回原因的软件或 NET 库 我收到退回的电子邮件到我可以阅读的 pop3 帐户 我需要它来保持我的用户数据库中不含无效
  • 如何打印pdf.js文档?

    我已经用 pdf js 生成了一个文档 并且它显示正确 我没有打印按钮 如何添加按钮以允许用户打印 我正在使用 Chrome 尝试使用 javascript 函数window print 这将打开打印对话框 您必须在 html 中添加一个按
  • 密码验证 REGEX 禁止空格

    密码不能包含空格 必须至少包含一个数字字符 必须包含 1 个大写字母 长度至少为 8 个字符 最多 15 个 这就是我所拥有的 它可以执行除空白规则之外的所有操作 d A Z 8 15 为此添加什么 多谢 语言 c asp RegularE
  • 拨打 USSD 代码?

    当我直接从听筒拨打时 它可以工作 例如 123 获取号码余额 但是 当我尝试在应用程序中执行相同的操作时 我遇到了问题 拨号器中显示的号码缺少结尾 我的应用程序中需要它 我希望我的应用程序应该支持所有 USSD 代码 有没有办法在应用程序中
  • javascript 传递 eval 变量

    我有 eval 函数 它需要从 php 执行 javascript 但我需要传递元素 这样我就可以将鼠标悬停在用户单击的链接上的提示上 var globalEval function globalEval src element if wi
  • 不可变且按值传递

    我有以下代码一个可变的 Person 类 String 以及修改 String 和 Person 实例的方法 class Person int a 8 public int getA return a public void setA in
  • 限制UITextview的行数

    我想知道如何限制用户在编辑 UITextField 时可以输入的行数 不是其他问题中询问的字符数 理想情况下 我想将输入限制为最大值 10 行 我需要从哪里开始 我是否用某种方法来做到这一点 在 BOOL textViewShouldBeg
  • SpelEvaluationException:EL1007E:(位置43):在空值上找不到字段或属性“组”

    我已经为我的 Web 应用程序完全配置了 SPRING METHOD 安全性 启用 PRE POST 注释 然而最近我遇到了一个奇怪的问题 总结如下 POJOS总结 User Class public class User int id S
  • Ninject 和静态类 - 如何?

    我有一个静态类 我需要向其中注入一些实例 静态类可以有静态构造函数 但它必须是无参数的 那么 我该如何向其中注入一些东西呢 我不想创建一个单身人士 我希望有一个静态类 并且它的方法之一对应该注入的实例进行操作 下面是我需要的示例 publi