2013-04-15 26 views
1

我們有一個類(實際上有很多),它有一個靜態初始化函數,它需要在依賴注入容器內使用Unity執行一個對象。使用Unity調用靜態注入方法

public class MyClass 
{ 
    public static void InitializeMappings(IMapper mapper) 
    { 
     // Do stuff to mapper 
    } 
} 

我想每當一個新的IMapper實例由統一容器實例被稱爲InitializeMappings功能。

我需要幫助:

  • 呼叫從容器
  • InitializeMappings功能解決了mapper參數的函數調用
  • 呼叫連接多達InitializeMappings到IMapper實現的壽命

我將如何去實現/定義這個?

+1

這是一種靜態方法。您可以在應用程序啓動過程中輕鬆地自行調用它。 – Steven

+0

@Steven - 但那我該如何將靜態函數綁定到容器項目(即IMapper)的生命週期? – Reddog

回答

5

這是不好的設計;爲什麼沒有mapper實現直接在構造函數中調用setup函數呢?

您可以通過擴展或使用注入工廠來獲取容器。事情是這樣的:

container.RegisterType<IMapper>(
    new WhateverLifetimeYouWant(), 
    new InjectionFactory(
     c => { 
      var mapper = c.Resolve<IMapper>("RealMapper"); 
      MyClass.InitializeMappings(mapper); 
      return mapper; 
     } 
) 
.RegisterType<IMapper, ActualMapper>("RealMapper"); 

然後,每當你做container.Resolve<IMapper>()它會運行的代碼,小塊。

這隻能通過API工作,而不能通過配置文件。

+0

我的映射器實現是一個我無法訪問的類。然而,事後看來,我應該把它封裝起來,按照你在頂層的建議完成 - 通過在構造函數中調用它們。但是這種方法僅適用於控制映射器實現的數量的情況。 注塑工廠的想法雖然工作得很好。謝謝! – Reddog

2

在WPF我相信你能做到以下

container.RegisterType<Mapper, Mapper>(); 
container.Register<IMapper>(
    new InjectionFactory(c => { 
     var mapper = c.Resolve<Mapper>(); 
     MyClass.InitializeMappings(mapper); 
     return mapper; 
    }) 
); 

至於「連接起來調用IMapper的一生:」我不明白你的意思。任何創建並僅由映射器對象引用的對象將在映射器對象被垃圾收集時收集。