2010-01-13 29 views
58

Tôi là một người mới hoàn thành để từ chốiMục đích của mô-đun Ninject là gì?

Tôi đã tách mã của người khác và tìm thấy một số trường hợp mô-đun nInject - các lớp học lấy từ Ninject.Modules.Module và có phương thức tải chứa hầu hết mã của họ.

Các lớp này được gọi bằng cách gọi phương thức LoadModule của một thể hiện của StandardKernel và chuyển nó một thể hiện của lớp mô-đun.

Có lẽ tôi đang thiếu một cái gì đó hiển nhiên ở đây, nhưng lợi ích của việc này chỉ là tạo ra một lớp cũ đơn giản và gọi phương thức của nó, hoặc có lẽ là một lớp tĩnh với một phương pháp tĩnh?

module

 

Trả lời

61

Các Ninject là những công cụ dùng để đăng ký các loại khác nhau với các container IoC. Ưu điểm là các mô-đun này sau đó được giữ trong các lớp riêng của chúng. Điều này cho phép bạn đặt các tầng/dịch vụ khác nhau trong các mô-đun riêng của chúng.

// some method early in your app's life cycle 
public Kernel BuildKernel() 
{ 
    var modules = new INinjectModule[] 
    { 
     new LinqToSqlDataContextModule(), // just my L2S binding 
     new WebModule(), 
     new EventRegistrationModule() 
    }; 
    return new StandardKernel(modules); 
} 

// in LinqToSqlDataContextModule.cs 
public class LinqToSqlDataContextModule : NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<IRepository>().To<LinqToSqlRepository>(); 
    } 
} 

Có nhiều mô-đun cho phép tách mối quan tâm, ngay cả trong vùng chứa IoC của bạn.

Phần còn lại của bạn đặt câu hỏi giống như âm thanh là nhiều hơn về IoC và DI nói chung chứ không chỉ Ninject. Có, bạn có thể sử dụng các đối tượng cấu hình tĩnh để làm tất cả mọi thứ mà một container IoC thực hiện. IoC container trở nên thực sự tốt đẹp khi bạn có nhiều phân cấp phụ thuộc.

public interface IInterfaceA {} 
public interface IInterfaceB {} 
public interface IInterfaceC {} 

public class ClassA : IInterfaceA {} 

public class ClassB : IInterfaceB 
{ 
    public ClassB(IInterfaceA a){} 
} 

public class ClassC : IInterfaceC 
{ 
    public ClassC(IInterfaceB b){} 
} 

Xây dựng ClassC là một điểm đau tại điểm này, với nhiều độ sâu của giao diện. Sẽ dễ dàng hơn khi hỏi hạt nhân cho một IInterfaceC.

var newc = ApplicationScope.Kernel.Get<IInterfaceC>(); 
+1

LinqToSqlDataContextModule nên mở rộng StandardModule? –

+1

@Mark Gibaud không có trong Ninject 2. StandardModule đã biến mất và được thay thế bằng NinjectMdule - http://github.com/enkari/ninject/tree/master/src/Ninject/Modules/ –

+1

Đó là một ví dụ tốt, nhưng thử nghiệm thì sao? Tôi liên tục nghe như thế nào một container DI/IoC có thể giúp tôi với testability, nhưng tôi đang có một thời gian khó khăn để tìm một ví dụ thực tế mà sẽ giới thiệu rằng Ninject sẽ không gây ô nhiễm mã của tôi và cũng tạo điều kiện testability. Có bất kỳ dự án nguồn mở thế giới thực nào mà tôi có thể xem xét để có được ý tưởng không? –

9

Có lẽ tôi đang thiếu một cái gì đó rõ ràng ở đây, nhưng vì lợi ích của đây là những gì trên chỉ tạo ra một lớp cũ đồng bằng và gọi phương thức của nó, hoặc có lẽ một lớp tĩnh với một phương pháp tĩnh ?

Có, bạn chỉ có thể gọi một loạt các câu hỏi Bind<X>().To<Z>() để thiết lập các ràng buộc, không có mô-đun.

Sự khác biệt là nếu bạn đặt các báo cáo trong một mô-đun sau đó:

  • IKernel.Load(IEnumerable<Assembly>) động có thể khám phá các module đó thông qua phản ánh và tải chúng.
  • các liên kết được nhóm hợp lý lại với nhau dưới tên; bạn có thể sử dụng tên này để dỡ bỏ chúng lại với IKernel.Unload(string)
3

Có lẽ tôi đang thiếu một cái gì đó rõ ràng ở đây, nhưng vì lợi ích của việc này qua chỉ tạo ra một lớp cũ đồng bằng và gọi phương thức của nó, hoặc có lẽ một là những gì lớp tĩnh với một phương thức tĩnh?

Đối với chúng tôi, khả năng thêm thử nghiệm sau này rất dễ dàng. Chỉ cần ghi đè lên một vài ràng buộc với mockobjects và voila .....trên mã kế thừa mà không có DI có dây "mọi thứ" lên, gần như không thể bắt đầu chèn các trường hợp thử nghiệm mà không cần sửa lại. Với một DI tại chỗ VÀ miễn là nó đã được sử dụng đúng nơi DI có dây tất cả mọi thứ lên, nó là rất đơn giản để làm như vậy ngay cả trên mã di sản có thể rất xấu xí.

Trong nhiều khung công tác DI, bạn có thể sử dụng mô-đun sản xuất cho thử nghiệm của mình với mô-đun thử nghiệm ghi đè các ràng buộc cụ thể bằng mockobject (để phần còn lại của hệ thống dây điện tại chỗ). Đây có thể là thử nghiệm hệ thống nhiều hơn kiểm tra đơn vị, nhưng tôi có xu hướng thích kiểm tra cấp cao hơn so với nhà phát triển trung bình vì nó kiểm tra sự tích hợp giữa các lớp và đó là tài liệu tuyệt vời cho người tham gia dự án và có thể thấy toàn bộ tính năng đang hoạt động (thay vào đó chỉ là một phần của tính năng) mà không cần phải thiết lập toàn bộ hệ thống).

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