8

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

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

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 和静态方法的问题,但似乎没有一个能解决这样的问题。

4

2 回答 2

20

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

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

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

于 2013-06-01T00:11:29.360 回答
1

附带说明一下,锁是完全没用的,因为您正在锁定对局部变量“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;
                    }
                }
            }
于 2014-03-04T13:32:25.527 回答