2013-01-03 37 views
9

Tôi đang tạo một dự án mới trong ASP.net bằng cách sử dụng MVC 4.Thực tiễn tốt nhất cho việc tiêm phụ thuộc

Tôi muốn thiết lập tiêm phụ thuộc sử dụng Ninject. Nhưng trước khi tôi tiến hành các phương pháp hay nhất khi thiết lập tiêm phụ thuộc là gì?

Hiện tại tôi có thiết lập lớp chất kết dính trong dự án web sẽ tham chiếu dự án dữ liệu trong giải pháp.

Lớp chất kết dính được như hình dưới đây:

Public static class Binder 
{ 
    static Ninject.IKernel _kernel; 

    static Binder() 
    { 
     _kernel = new Ninject.StandardKernel(); 

     _kernel.Bind<IConfig>().To<AppSettingsConfig>(); 
     _kernel.Bind<IDocuments>().To<DocumentsClass.Documents>(); 

    } 

    public static T GetImplementation<T>() 
    { 
     return _kernel.Get<T>(); 
    } 

} 

Sau đó, trong vòng điều khiển của tôi sử dụng phương pháp GetImplementation sử dụng chính xác đòi hỏi phụ thuộc chứ không phải đăng ký tất cả khi khởi động ứng dụng.

Ví dụ mã từ bộ điều khiển:

Public ActionResult Get (int id) 
{ 
    var repository = Binder.GetImplementation<IDocuments>(); 

    // do some stuff with the repository here 
} 

Không chắc chắn nếu điều này sẽ là một cách tiếp cận tốt? Mọi lời khuyên sẽ tốt.

+4

Một mã nhỏ cũng sẽ tốt? – BenjaminPaul

+1

@Wiktors câu trả lời dưới đây là cách để đi. Sử dụng tiêm constructor càng nhiều càng tốt. Chỉ sử dụng mẫu chống SL nếu, vì một số lý do bạn không thể thiết lập chuỗi phụ thuộc đầy đủ. –

Trả lời

16

Điều bạn hiện có là ví dụ về mẫu chống dịch vụ Định vị dịch vụ. Google để biết thêm chi tiết vì nó đã được thảo luận nhiều lần.

Nói tóm lại, chứ không phải dựa trên định vị dịch vụ

public class SomeController 
{ 
    public ActionResult Get (int id) 
    { 
     var repository = Binder.GetImplementation<IDocuments>(); 

     // do some stuff with the repository here 
    } 
} 

bạn nên dịch vụ của bạn tiêm vào lớp khách hàng (dựa vào constructor injection)

public class SomeController 
{ 
    private IDocuments documentService { get; set; }  

    public SomeController(IDocuments documentService) 
    { 
    this.documentService = documentService; 
    } 

    public ActionResult Get (int id) 
    { 
     var repository = documentService; 

     // do some stuff with the repository here 
    } 
} 

Trong trường hợp cụ thể này, bạn có thể thiết lập nhà máy điều khiển của bạn để sử dụng container IoC của bạn để giải quyết các bộ điều khiển của bạn.

0

Bạn được liên kết với thể hiện của lớp Binder trong bộ điều khiển. Nó làm cho lớp của bạn không thể tái sử dụng được và nó phải được tái cấu trúc, bởi vì nó không phải là độ linh hoạt của bộ điều khiển để có được thể hiện chính xác của việc triển khai IDocuments. Phải có một số trình phân giải phụ thuộc bên ngoài (như ví dụ - Ninject) mà phải làm cho việc xây dựng hoặc tiêm thuộc tính.

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