2012-04-22 15 views
9

kullanarak bağımlılık özelliği enjekte aşağıdaki sınıfları:Nasıl IOC Unity

public interface IServiceA 
{ 
    string MethodA1(); 
} 

public interface IServiceB 
{ 
    string MethodB1(); 
} 

public class ServiceA : IServiceA 
{ 
    public IServiceB serviceB; 

    public string MethodA1() 
    { 
     return "MethodA1() " +serviceB.MethodB1(); 
    } 
} 

public class ServiceB : IServiceB 
{ 
    public string MethodB1() 
    { 
     return "MethodB1() "; 
    } 
} 

Ben IoC için Unity kullanmak benim kaydı şöyle görünür:

container.RegisterType<IServiceA, ServiceA>(); 
container.RegisterType<IServiceB, ServiceB>(); 

Ben ServiceA örneği çözmek, serviceB, null olacaktır. Bunu nasıl çözebilirim? Burada

cevap

14

You have en az iki seçenek:

Sen/yapıcı enjeksiyon kullanmalısınız, bunun için bir kurucu ihtiyaç olabilir:

public class ServiceA : IServiceA 
{ 
    private IServiceB serviceB; 

    public ServiceA(IServiceB serviceB) 
    { 
     this.serviceB = serviceB; 
    } 

    public string MethodA1() 
    { 
     return "MethodA1() " +serviceB.MethodB1(); 
    } 
} 

Veya Birlik bunun için bir özelliği gerekir, mülkiyet enjeksiyon destekler ve DependencyAttribute:

public class ServiceA : IServiceA 
{ 
    [Dependency] 
    public IServiceB ServiceB { get; set; }; 

    public string MethodA1() 
    { 
     return "MethodA1() " +serviceB.MethodB1(); 
    } 
} 

MSDN sitesi What Does Unity Do? Birlik için iyi bir başlangıç ​​noktasıdır.

+6

Kurucu ile özellik enjeksiyonu arasında seçiminiz varsa, kurucu enjeksiyonunu seçmeniz gerektiğini düşünüyorum. Mülkiyet enjeksiyonu, sınıfı birliğe veya bu bağımlılığı sağlamak için ihtiyaç duydukları 'hatırlamayı' isteyen başka bir araca bağımlı hale getirecektir. Yapıcı enjeksiyonu, sınıfı sınıf için bağımlılığın zorunlu olduğu sınıfını kullanmaya çalışan herkese açık hale getirir. – Carlos

+0

Sınıfta birden fazla bağımlılık varsa, bazı çağrılarda bu gerekli değildir? Hepsi örneklenecek mi? Ya da sadece, yukarıdaki gibi erişildiğinde, örneğin: serviceB.method()? @Carlos – Legends

+1

@ Tüm bağımlılıklarınız, tüm yönteminizde kullanmasanız bile ServiceA oluşturulduğunda taklit edilir ve enjekte edilir. Unity, kutudan tembel bir örneği desteklemiyor ancak uzantı olarak eklenebilir: http://pwlodek.blogspot.hu/2010/05/lazy-and-ienumerable-support-comes-to.html – nemesv