簡體   English   中英

Ninject 和靜態類 - 如何?

[英]Ninject and static classes - how to?

我有一個靜態類,我需要向其中注入一些實例。 靜態類可以有靜態構造函數,但它必須是無參數的。 那么,我該如何注入一些東西呢?

我不想創建一個單身人士。 我希望有一個靜態類,它的方法之一對應該注入的實例進行操作。 下面是我需要的那種東西的例子:

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. 這樣的靜態方法只需要調用一次,所以讓你的容器為你自動連接它並沒有真正的幫助。

附帶說明一下,該鎖完全沒用,因為您正在鎖定對局部變量“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;
                    }
                }
            }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM