2010-01-12 34 views
18

Tôi đã tự hỏi khi nào tôi sử dụng tích lũy và khi nào tôi sử dụng giải quyết, khi sử dụng IOC thống nhất.Unity IOC Buildup vs Resolve?

Và khi nào tôi gọi là teardown?

Cảm ơn

Trả lời

21

Resolve được sử dụng khi bạn muốn container Unity để xây dựng các trường hợp (một cái mới ngay khi bạn cần nó hoặc một tồn tại trước đó singleton), tiêm phụ thuộc của nó và đưa cho bạn tham chiếu đến đối tượng .

BuildUp được sử dụng khi bạn đã có đối tượng của đối tượng và muốn vùng chứa chỉ giải quyết và tiêm phụ thuộc của nó.

Teardown ngược lại với BuildUp. Bạn có thể truyền đối tượng của bạn đến phương thức Teardown của container để tắt/dọn dẹp/bất cứ thứ gì bạn muốn. Hành vi của vùng chứa hiện tại không có gì ở thời gian Teardown, nhưng các phần mở rộng có thể được viết để tận dụng điều này. Bạn cũng có thể làm cho các đối tượng của bạn triển khai IDisposable và vùng chứa sẽ gọi Dispose() trên đối tượng của bạn khi nó được xử lý.

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

Có gì Rafa nói nó trở nên rõ ràng rằng không giống như Resolve()BuildUp() không giúp với hệ thống phun ctor. Một kịch bản phổ biến là khi bạn tạo đối tượng của mình ở đâu đó bên ngoài, chuyển nó thành một tham số và xây dựng nó bên trong. (Bên ngoài và bên trong liên quan đến cơ thể của một phương pháp.) Ngoài ra, bạn có thể cần phải gọi Teardown() để làm sạch đối tượng và hoàn nguyên nó về trạng thái trước khi chuyển thành tham số. Tuy nhiên, hãy cẩn thận, vì Unity được xây dựng trong Teardown() không làm gì cả, đó là loại trình giữ chỗ phù hợp để ghi đè.

Một exampe có thể là đối tượng máy in. Sau khi tạo tài khoản, bạn gọi nó theo một số phương pháp khác mỗi lần tiêm đầu trang/chân trang khác nhau:

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(); 
    } 
} 
Các vấn đề liên quan