2010-01-02 17 views
14

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.

+0

xem http://stackoverflow.com/questions/367178/usage-of-ioc-containers-specifically-windsor –

+0

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

Trả lời

3

Đối với vấn đề phụ thuộc "khoai tây nóng", điều này không phải xảy ra. Khung tiêm phụ thuộc xử lý việc này cho bạn. Ví dụ, nếu Class1 có sự phụ thuộc vào Class2, và Class2 có sự phụ thuộc vào Class3, bạn không cần phải tiêm Class3 vào Class1 để phù hợp với sự phụ thuộc Class2. Hạt nhân sẽ đi xuống chuỗi phụ thuộc cho bạn và sẽ tự động giải quyết các phụ thuộc dòng xuống (miễn là tất cả các lớp trong vở kịch đã được đăng ký trong hạt nhân) khi bạn yêu cầu một Class1.

Class1 phụ thuộc vào Class2 phụ thuộc vào class3

Các constructor Class1 không cần phải đề cập đến class3 ở tất cả.

Đối với vấn đề thứ hai, cách thức hoặc nếu điều này là chỗ ở phụ thuộc vào khung. Với Ninject, tôi nghĩ bạn có thể sử dụng cú pháp Bind().To().WithConstructorArgument() để cung cấp mục Danh sách mới cho hàm tạo.

+0

1) Tát mặt. Không biết làm thế nào kiểm tra của tôi về điều này không thành công trước đây, nhưng chắc chắn đủ, xử lý những thứ dây xuống chuỗi mà không có vấn đề. 2) Cú pháp WithConstructorArgument đã thay đổi trong Ninject v2, nhưng tôi không thể nhớ lại nó. Bất kể, điều này yêu cầu rằng máy chủ lưu trữ cổng/dịch vụ tĩnh của bạn xử lý cài đặt này hoặc bạn cần tham chiếu hạt nhân khi bạn muốn đặt hoặc đối số cần được biết trước khi chạy (tức là chuỗi kết nối cơ sở dữ liệu). Vì vậy, tôi chỉ cần thiết lập như tài sản mà cảm thấy mong manh hơn, nhưng nó hoạt động và nó là phù hợp với những gì tôi đã đọc trước đây. – Ted

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