Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Ninject和静态类-如何?_C#_Static_Ninject - Fatal编程技术网

C# Ninject和静态类-如何?

C# Ninject和静态类-如何?,c#,static,ninject,C#,Static,Ninject,我有一个静态类,需要向其中注入一些实例。静态类可以有静态构造函数,但必须是无参数的。那么,我该如何向它注入一些东西呢 我不想创造一个单身汉。我希望有一个静态类,它的一个方法操作一个应该被注入的实例。下面是我需要的一个例子: public static class AuthenticationHelper { // Fields. private static object _lock = new object(); private static readonly User

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

我不想创造一个单身汉。我希望有一个静态类,它的一个方法操作一个应该被注入的实例。下面是我需要的一个例子:

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 */ }
}
公共静态类AuthenticationHelper
{
//田地。
私有静态对象_lock=新对象();

私有静态只读用户业务_UserBusiness;//不要这样做。不要使用需要其自身依赖关系的静态类。这会使测试更加困难,依赖此
AuthenticationHelper
的其他类型将无法将其包含在其构造函数中,这意味着它们隐藏了依赖它的事实

相反,只需执行您经常执行的操作:使
AuthenticationHelper
非静态,在其上实现
iaauthenticationhelper
接口,并通过其公共构造函数注入所有依赖项


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

作为补充说明,锁是comp完全没有用,因为您正在锁定对局部变量“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;
                    }
                }
            }

我明白了。我没有意识到这是一个如此糟糕的做法,但有了你的解释,我现在可以理解它了,并将遵循你的建议。无论如何,如果没有其他选择,知道如何解决这个问题是很好的。谢谢!这是真的,有时你不能。例如,当将依赖注入引入遗留应用程序时,你将不得不移动小步骤。在这些临时步骤中,有一个可能是这样的解决方案。这很难看,是技术深度,但是临时的(至少应该是这样)。但是如果您的应用程序已经使用DI构建,那么就没有理由这样做。