2015-06-24 69 views
1

是的,我知道,最好是使用構造函數注入,我大部分時間都在使用它,但是,有一種情況下我喜歡使用屬性注入:是否可以使用Nancyfx默認的TinyIoc容器進行Property注入?

我有一個存儲庫基類,數據庫工廠,也是一個服務來讀取應用程序設置(ConfigurationManager中的抽象)的

public abstract class RepositoryBase(){ 
    public IDatabaseFactory DatabaseFactory { get; set; } 
    public IAppConfigService AppConfig { get; set; } 

    protected Database Db 
    { 
     get 
     { 
      var db = DatabaseFactory.Get(); 
      ... not relevant code ... 
      return db; 
     } 
    } 
} 

我不想在這裏使用的構造函數依賴,因爲這將迫使我的構造函數添加到我的所有資料庫,我可以做它,但我不想。更糟糕的問題是,如果由於某種原因,我將一個日誌服務添加到RespositoryBase類中,我將不得不將這個新的依賴項添加到所有存儲庫類的構造函數中,但這並不酷。

我可以使用一些像服務聚合這樣的模式來避免修改RepositoryBase類,但這看起來太複雜了,我真的很想讓事情變得簡單,這樣每個人都可以理解正在發生的事情(包括我)。

那麼,是否有可能通過Nancy/TinyIOC注入這些依賴關係?

回答

0

如果我們展望TinyIoC的代碼,我們會發現什麼地方是創建對象後沒有屬性注入代碼:https://github.com/NancyFx/Nancy/blob/master/src/Nancy/TinyIoc/TinyIoC.cs#L3693原始回購太:https://github.com/grumpydev/TinyIoC/blob/master/src/TinyIoC/TinyIoC.cs#L3849

如果我們有這樣的事情補丁代碼:

 try 
     { 
      object o = null; 
#if USE_OBJECT_CONSTRUCTOR 
      var constructionDelegate = CreateObjectConstructionDelegateWithCache(constructor); 
      o = constructionDelegate.Invoke(args); 
#else 
      o = constructor.Invoke(args); 
#endif 
      BuildUp(o, ResolveOptions.Default); 

      return o; 
     } 
     catch (Exception ex) 
     { 
      throw new TinyIoCResolutionException(typeToConstruct, ex); 
     } 

它會工作,但我們會得到另一個問題。主要問題是BuildUp將嘗試填充它將找到的所有空引用。而且也沒有appropiate ResolveOptions避免這種情況:(我說得對不對?

...

最後我創造了進樣屬性,你可以用標記[進樣]任何引用類型的屬性,你會得到的。期望的行爲

源可以在這裏找到:https://github.com/AIexandr/Nancy/blob/master/src/Nancy/TinyIoc/TinyIoC.cs 的所有變化都向後兼容

0

是的,TinyIoC supports property injection。這也應該在南希工作。

+2

雖然TinyIoC支持它,它比默認的解決不同的方法解決沒有物業注射填充你有什麼。想法如何真正配置引導程序(或使用註冊表離子等)默認做屬性注入?問道,因爲我選擇使用windsor,因爲我無法用TinyIoc做到這一點。 –

+1

嗨基督教,是的TinyIoC文件說,它支持,但它似乎無法與南希出於某種原因。也許我錯過了一些東西(我希望!)。 – Auresco82

相關問題