Ninject和静态类 – 如何?

我有一个静态类,我需要注入一些实例。 静态类可以有静态构造函数,但它必须是无参数的。 那么,我该怎么办呢?

我不想创建一个单身人士。 我希望有一个静态类,其中一个方法对应该注入的实例进行操作。 贝娄是我需要的一个例子。

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)创建一个静态的Initialize(UserBusiness userBusiness)方法,并在你的应用程序的启动路径中调用这个方法。 你不能让你的DI容器调用这个静态方法。 他们不允许因为1.这是一个坏主意,而且2.这种静态方法只需要调用一次,所以让你的容器为你自动连接它并没有真正帮助。

作为旁注,锁定是完全无用的,因为您锁定对本地变量“user”的访问权限,该变量不会在2“if(user == null)”行之间发生变化。

您的目的是锁定对Context.Session [CURRENT_USER]元素的访问,因此..

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