[英]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.