2010-01-12 17 views

cevap

21

Çöz Unity konteyner (sadece bunu ya da önceden var olan singleton gerektiğinde yenisini), bağımlılıklarından enjekte edip size nesneye başvuruyu el örneğini oluşturmak istediğinizde kullanılır .

Önceden bir nesne örneğiniz olduğunda ve kapsayıcının yalnızca bağımlılıklarını çözmesi ve enjekte etmesi için BuildUp kullanılır.

Teardown, BuildUp'ın tam tersidir. İstediğiniz şeyi kapatmak/temizlemek/kapatmak için nesneyi kabın Teardown yöntemine iletebilirsiniz. Varolan kapsayıcı davranış, Teardown zamanında hiçbir şey yapmaz, ancak bundan yararlanmak için uzantılar yazılabilir. Nesnelerinizin kimliğini kullanılabilir hale getirebilir ve kapsayıcı, kendi imha edildiğinde nesnenizde Dispose() öğesini çağırır.

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

Rafa o BuildUp()Resolve() aksine ctor enjeksiyonu ile yardımcı olmuyor ortaya çıkmaktadır söyledikten sonra neler. Ortak bir senaryo, nesneyi dışarıda bir yerde oluşturduğunuzda, onu bir parametre olarak geçirip içine yerleştirdiğinizde ortaya çıkar. (Dışarıdan ve içeriden bir yöntemin gövdesi ile ilgilidir.) Ek olarak nesneyi temizlemek ve bir parametre olarak geçmeden önceki durumuna geri döndürmek için Teardown() numaralı telefonu aramanız gerekebilir. Bununla birlikte, Unity'nin Teardown() modelinde hiçbir şey yapmadığından dolayı, dikkat edilmesi gereken bir yer tutucudur.

Bir yazıcı, bir yazıcı nesnesi olabilir. Bir tane oluşturduktan sonra, her seferinde farklı üstbilgi/altbilgi enjekte ederken başka yöntemlerde de kullanabilirsiniz:

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(); 
    } 
}