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>();
Nguồn
2010-01-13 12:18:30
LinqToSqlDataContextModule nên mở rộng StandardModule? –
@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/ –
Đó 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? –