2012-04-22 37 views
9

Tôi có các lớp sau:Làm thế nào để tiêm bất động sản phụ thuộc sử dụng 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() "; 
    } 
} 

tôi sử dụng Unity cho IoC, đăng ký của tôi trông như thế này:

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

Khi tôi giải quyết một trường hợp ServiceA, serviceB sẽ là null. Tôi có thể giải quyết vấn đề này bằng cách nào?

Trả lời

14

Bạn có ít nhất hai lựa chọn ở đây:

Bạn có thể/nên sử dụng constructor injection, cho rằng bạn cần một constructor:

public class ServiceA : IServiceA 
{ 
    private IServiceB serviceB; 

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

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

Hoặc Unity hỗ trợ tiêm bất động sản, cho rằng bạn cần một tài sản và số DependencyAttribute:

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

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

Trang web MSDN What Does Unity Do? là điểm khởi đầu tốt cho Unity.

+6

Nếu bạn có lựa chọn giữa hàm tạo và thuộc tính tiêm, tôi nghĩ bạn nên chọn phương thức khởi tạo. Việc tiêm thuộc tính sẽ làm cho lớp phụ thuộc vào sự thống nhất hoặc một số người gọi khác 'nhớ' mà họ cần để cung cấp sự phụ thuộc đó. Constructor injection làm cho nó rõ ràng cho bất cứ ai cố gắng sử dụng lớp mà phụ thuộc là điều cần thiết cho lớp. – Carlos

+0

Và nếu lớp học có nhiều phụ thuộc, đó không phải là tất cả cần thiết trong các cuộc gọi nhất định? Tất cả chúng sẽ được khởi tạo? Hoặc chúng sẽ chỉ được khởi tạo khi được truy cập, như trên: serviceB.method()? @Carlos – Legends

+1

@Chỉ định tất cả các phụ thuộc của bạn sẽ được instated và inject khi ServiceA được tạo ngay cả khi bạn không sử dụng chúng trong tất cả các phương pháp của bạn. Unity không hỗ trợ instantiation lười biếng ra khỏi hộp nhưng nó có thể được thêm vào như là phần mở rộng: http://pwlodek.blogspot.hu/2010/05/lazy-and-ienumerable-support-comes-to.html – nemesv

Các vấn đề liên quan