Hãy xem xét mã sau đây.Tiêm mảng giao diện trong Ninject
public interface IFoo { }
public class Bar
{
public Bar(IFoo[] foos) { }
}
public class MyModule : NinjectModule
{
public override void Load()
{
Bind<IFoo[]>().ToConstant(new IFoo[0]);
// ToConstant() is just an example
}
}
public class Program
{
private static void Main(string[] args)
{
var kernel = new StandardKernel(new MyModule());
var bar = kernel.Get<Bar>();
}
}
Khi tôi cố gắng chạy chương trình, tôi nhận được ngoại lệ sau.
Lỗi kích hoạt IFoo
Không có ràng buộc phù hợp và loại không tự ràng buộc. con đường
Kích hoạt:
2) Tiêm phụ thuộc vào IFoo foos tham số của constructor kiểu Bar
1) Yêu cầu Bar
Làm thế nào tôi có thể tiêm/bám vào một mảng trong Ninject?
Cảm ơn thời gian của bạn.
Chỉnh sửa:
Dữ liệu nhập ứng dụng của tôi do thành phần bên thứ ba tạo. Quá trình nhập áp dụng loại bộ lọc khác nhau (ví dụ: triển khai các giao diện bộ lọc khác nhau). Các quy tắc để lọc thay đổi khá thường xuyên nhưng quá phức tạp để thực hiện với cấu hình thuần túy (và một bộ lọc chính).
Tôi muốn thêm/chỉnh sửa bộ lọc dễ dàng nhất có thể. Những gì tôi có là một hội đồng nơi mà tất cả các triển khai bộ lọc được đặt trong. Tôi đã cố gắng ràng buộc mọi giao diện bộ lọc theo phương pháp sau (cung cấp một thể hiện của mọi triển khai của loại bộ lọc đó). Về cơ bản tôi muốn tránh sự cần thiết phải thay đổi mô-đun Ninject của tôi khi tôi thêm/loại bỏ các lớp lọc.
private IEnumerable<TInterface> GetInterfaceImplementations<TInterface>(IContext context)
{
return GetType().Assembly.GetTypes()
.Where(t => typeof (TInterface).IsAssignableFrom(t) && IsConcreteClass(t))
.Select(t => Kernel.Get(t)).Cast<TInterface>();
}
Tôi cảm thấy hơi có lỗi khi bỏ qua cơ chế DI vùng chứa. Đây có phải là một thực hành không tốt? Có một thực tế phổ biến để làm những việc như vậy?
Độ phân giải:
Tôi sử dụng lớp bao bọc làm đề xuất bsnote.
Tôi đã chọn câu trả lời này vì câu trả lời chi tiết hơn. Cảm ơn (+1) đến bsno te, quá! –