假設下面的基本項目 - 設置:MVC DisplayNameAttribute和Ninject:可能嗎?
- Core
-- Attributes
--- CustomDisplayNameAttribute : DisplayNameAttribute
- UI
UI代表了MVC的Web界面,核心實現了所有的域業務對象,包括像CustomDisplayNameAttribute
編寫自己的屬性。該屬性包含額外的依賴項,如語言解析器,例如,處理備用訂單。 Hibernate會話將是另一種可能的依賴關係。
在早期的項目中,這些屬性執行全局請求以獲取解析器。這是IMO醜陋,應該以不同的方式處理。此外,Core應該保留在沒有HttpContext
的情況下:由於每個請求都需要語言解析器,因此最終可能會收集到HttpContext
Items Collection。
現在我與Ninject相當初學者,我不知道這是否是爲了得到這種依賴性變得像一個CustomDisplayNameAttribute
正確的工具?
在的話,將是這樣的:
- 如果創建的屬性,從
HttpContext
項目集合 - 填充的語言解析器的其他語言解析器財產如果沒有
HttpContext
(如測試,石英工作等),從別的地方得到它。
THX對於任何輸入
編輯:採樣代碼
namespace Core.Attributes
{
public class CustomDisplayNameAttribute : DisplayNameAttribute
{
private string textCode;
/// <param name="textCode">According to this Text-Code, we will load
/// and resolve the text.</param>
public DeimosDisplayNameAttribute(string textCode)
{
this.textCode = textCode;
}
/// <summary>
/// Load and resolve Text according to Text-Code
/// </summary>
public override string DisplayName
{
get
{
// Load - Ooops: First global access
// --> How can it be injected with IoC?
TextbausteinRepository repo = Root.GetTextBausteinRepository();
var textItem = repo.GetText(textCode);
// Resolve - Ooops: Second global access
// --> How can it be injected with IoC?
TextResolver resolver = Root.GetTextResolver();
return resolver.resolve(textItem);
}
}
}
}
編輯2:在這種情況下,似乎周圍有一個全球性的訪問沒有辦法,像註冊表模式或類似的。 UI將在那裏註冊所需的數據,並且屬性將從那裏訪問它。我們開始考慮將其存儲在ThreadLocal<T>
中,但由於在生命週期中存在線程交換的可能性,所以這似乎並不真正節省。所以似乎沒有辦法在註冊表層中存儲HttpContext
。有關此主題的更多信息,請參見[杯(T)] [1]。
我不清楚你想要做什麼。你能提供一些示例源代碼嗎? – 2012-08-08 15:54:39
添加了「CustomDisplayNameAttribute」的代碼示例,該示例應顯示我想要以某種方式解析的依賴關係,而無需任何全局請求。 – sl3dg3 2012-08-08 16:02:59
所以你說的是你想要使用具有屬性的依賴注入。 – 2012-08-08 16:06:12