0

假設下面的基本項目 - 設置: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]。

+0

我不清楚你想要做什麼。你能提供一些示例源代碼嗎? – 2012-08-08 15:54:39

+0

添加了「CustomDisplayNameAttribute」的代碼示例,該示例應顯示我想要以某種方式解析的依賴關係,而無需任何全局請求。 – sl3dg3 2012-08-08 16:02:59

+0

所以你說的是你想要使用具有屬性的依賴注入。 – 2012-08-08 16:06:12

回答

0

我不認爲這是可能的,因爲數據屬性不是像過濾器那樣運行時調度。因此,沒有地方可以攔截創作並注入你想要的東西。

+0

我想我會用註冊表模式工作。 – sl3dg3 2012-08-09 07:18:39