2010-01-12 68 views
18

我在想什麼時候使用buildup以及何時使用Unity的IOC時的解決方案。統一IOC堆積與解決?

什麼時候可以拆卸?

感謝

當你想統一容器構造實例(一個新的只是當你需要它或預先存在的單身),注入其依賴關係,並交給你的參考對象

回答

21

解決使用。

BuildUp用於已經有對象的實例並希望容器解析並注入其依賴關係的情況。

拆解與BuildUp相反。你可以將你的對象傳遞給容器的Teardown方法來關閉/清理/任何你想要的。現有的容器行爲在拆解時不會做任何事情,但可以編寫擴展來利用這一點。你也可以讓你的對象實現IDisposable,並且容器在它自己處理時會在你的對象上調用Dispose()。

IMyService service = container.Resolve<MyService>(); // New service or pre-existing singleton 

IMyService service = GetMyService(); // Get the instance from some source 
container.BuildUp(service); // Inject dependencies 
container.Teardown(service); // Clean-up 
0

遇到了什麼貝尼特斯說,很明顯,不像Resolve()BuildUp()不男星注入幫助。一種常見的情況是,當你在外面創建對象時,將它作爲參數傳遞並構建它。 (外部和內部與方法的主體相關。)另外,您可能需要調用Teardown()來清除對象並將其恢復到作爲參數傳遞之前的狀態。但是請注意,由於Unity的內置Teardown()什麼都不做,它是一種適合重寫的佔位符。

一個實驗可能是一個打印機對象。創建一個後,您可以使用多種其他方法將其稱爲每次注入不同頁眉/頁腳:

public class Decorations 
{ 
    public string Header { get; set; } 

    public string Footer { get; set; } 
} 

public class Printer 
{ 
    internal void Print(string message) 
    { 
     Console.WriteLine("HEADER: {0}", this.Decorations != null 
      && this.Decorations.Header != null 
       ? this.Decorations.Header 
       : string.Empty); 
     Console.WriteLine(message); 
     Console.WriteLine("FOOTER: {0}", this.Decorations != null 
      && this.Decorations.Footer != null 
       ? this.Decorations.Footer 
       : string.Empty); 
    } 

    [Dependency] 
    public Decorations Decorations { get; set; } 
} 

public class ClassA 
{ 
    public void Print(Printer printer, IUnityContainer container) 
    { 
     container.BuildUp(printer); 
     printer.Print("Hello from ClassA"); 
     container.Teardown(printer); 
    } 
} 

public class Program 
{ 
    private static void Main(string[] args) 
    { 
     var printer = new Printer(); 

     var containerA = new UnityContainer(); 
     containerA.RegisterInstance(new Decorations { 
      Header = "I am HEADER from Decorations #1", 
      Footer = "I am FOOTER from Decorations #1" }); 
     var containerB = new UnityContainer(); 
     containerB.RegisterInstance(new Decorations { 
      Header = "--- I am HEADER from Decorations #2 ---", 
      Footer = "--- I am FOOTER from Decorations #2 ---" }); 

     var a = new ClassA(); 

     a.Print(printer, containerA); 
     a.Print(printer, containerB); 

     Console.WriteLine("Press any key to continue..."); 
     Console.ReadKey(); 
    } 
}