gpt4 book ai didi

c# - Ninject 和静态类 - 如何?

转载 作者:太空狗 更新时间:2023-10-29 18:07:26 25 4
gpt4 key购买 nike

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

我不想创建单例。我希望有一个静态类,它的方法之一对应该注入(inject)的实例进行操作。下面是我需要的那种东西的例子:

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 接口(interface),并通过其公共(public)构造函数注入(inject)所有依赖项。

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

关于c# - Ninject 和静态类 - 如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16867566/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com