我在想什麼時候使用buildup以及何時使用Unity的IOC時的解決方案。統一IOC堆積與解決?
什麼時候可以拆卸?
感謝
當你想統一容器構造實例(一個新的只是當你需要它或預先存在的單身),注入其依賴關係,並交給你的參考對象我在想什麼時候使用buildup以及何時使用Unity的IOC時的解決方案。統一IOC堆積與解決?
什麼時候可以拆卸?
感謝
當你想統一容器構造實例(一個新的只是當你需要它或預先存在的單身),注入其依賴關係,並交給你的參考對象解決使用。
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
遇到了什麼貝尼特斯說,很明顯,不像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();
}
}