Tôi cần thêm một chút trợ giúp để "có được" như thế nào một DI framework như Ninject di chuyển qua những điều cơ bản.DI Framework: làm thế nào để tránh liên tục đi qua tiêm depencies lên chuỗi, và không sử dụng một dịch vụ định vị (cụ thể với Ninject)
Lấy mẫu Ninject:
class Samurai {
private IWeapon _weapon;
[Inject]
public Samurai(IWeapon weapon) {
_weapon = weapon;
}
public void Attack(string target) {
_weapon.Hit(target);
}
}
Nếu không có một khuôn khổ DI (tức là [Tiêm] tài liệu tham khảo ở trên) một lớp học tham khảo sẽ giống như thế:
class Program {
public static void Main() {
Samurai warrior1 = new Samurai(new Shuriken());
Samurai warrior2 = new Samurai(new Sword());
warrior1.Attack("the evildoers");
warrior2.Attack("the evildoers");
}
}
... nơi bạn' tái làm mới mọi thứ. Có, bạn đã loại bỏ sự phụ thuộc trong Samurai, nhưng bây giờ bạn đã có một sự phụ thuộc một bước xa hơn trong chuỗi. Đơn giản.
Với Ninject, bạn thoát khỏi newing lên tất cả mọi thứ theo:
class Program {
public static void Main() {
IKernel kernel = new StandardKernel(new WarriorModule());
Samurai warrior = kernel.Get<Samurai>();
warrior.Attack("the evildoers");
}
}
TUY NHIÊN, đây là khu vực của tôi về sự nhầm lẫn: không làm cho một số loại dịch vụ định vị để chăm sóc một cách hiệu quả newing lên hạt nhân áp dụng và mô-đun (tức là .IoC.TypeResolver.Get <>()), a) cách tốt nhất để không phải nhân hạt mới ở mọi nơi (tham chiếu dịch vụ locater ở mọi nơi?), và b) quan trọng hơn, khi bạn có chuỗi dài dài với phụ thuộc với phụ thuộc của riêng mình, bạn mang nó đến cực đoan của việc đi tiêm tất cả các con đường trong một cái gì đó mà tôi chắc chắn là một mô hình chống nghiêm trọng (một người bạn gọi nó là "tiêm phụ thuộc khoai tây nóng" chống -mẫu). Nói cách khác, tôi nghĩ rằng một phần của phép thuật khung DI là bạn không phải tiếp tục chèn phụ thuộc tất cả các cách lên chuỗi (tức là tham chiếu đầu tiên của bạn chứa 10 tham số trong hàm khởi tạo của nó, không ai trong số đó có bất cứ điều gì liên quan đến bất kỳ điều gì cho đến tận cùng chuỗi) - đó là ma thuật hoặc giải pháp cho sự nhầm lẫn của tôi để phụ thuộc không liên tục được tham chiếu lên và chuỗi hoặc tham chiếu locater dịch vụ lan rộng khắp mọi nơi.
Tiếp tục làm ướt các vùng nước cho tôi là sử dụng khung DI, cách tốt nhất để giải quyết một kịch bản trong đó lớp tham chiếu cần một IList thường được đặt trong hàm tạo (ví dụ: ReferencedClass (myList)) rằng, ngoài các trường hợp đơn giản như chuỗi kết nối cơ sở dữ liệu chuỗi, không bay. Chỉ cần thực hiện một tài sản và thiết lập nó sau khi mới nó lên/DI Framework dịch vụ định vị? I E.
var referencedClass = IoC.Get<IReferencedClass>();
referencedClass.MyList = myList;
Tất cả trong tất cả, tôi nghĩ đây là bài đăng tôi có thể sẽ cảm thấy xấu hổ sau khi nhận được nó, nhưng ngay bây giờ, tôi đã đánh đầu vào tường quá nhiều lần tiếp cận.
xem http://stackoverflow.com/questions/367178/usage-of-ioc-containers-specifically-windsor –
Cảm ơn. Liên kết này có lẽ là bản tóm tắt tốt nhất hoặc mọi thứ tôi đã thấy cho đến nay. Nói cách khác, có nhiều quan điểm khác nhau về các cổng tĩnh/các locator dịch vụ và các khung công tác DI. Tôi đang suy nghĩ giảm thiểu tài liệu tham khảo locater dịch vụ trong khi nhấn mạnh khả năng của khung DI để khởi tạo phụ thuộc xuống chuỗi tự động. – Ted