2012-02-07 33 views
8

Trong quá khứ, tôi sử dụng swiftsuspenders là bộ điều khiển IoC 3 ActionScript. Về cơ bản phiên bản đầu tiên của switfsuspender có cái gì đó tương tự như hạt nhân Ninject được gọi là kim phun.Tôi cần nhiều ví dụ thực tế hơn Ninject

Nếu tôi muốn tạo bộ phun ứng dụng (với giả sử ánh xạ phù hợp nhất được sử dụng trong suốt ứng dụng), tôi đã phải tiêm chính bộ phun trong các lớp ứng dụng.

Tôi tự hỏi bây giờ thực hành sử dụng kernel.get < là gì trong số nhiều lớp trong ứng dụng. Tôi có nên tiêm hạt nhân không?

Cá nhân tôi muốn sử dụng kernel.inject hơn nhưng nếu tôi có thể thực hiện kernel.inject, tôi có thể thực sự chèn các phụ thuộc theo cách thủ công, có lẽ tốt hơn (hôn).

Các trường hợp kiểm tra rất hay, nhưng chúng nằm xa các vấn đề thực tế thực tế, vì vậy tôi hy vọng bạn có thể giúp tôi làm rõ điểm này. Cảm ơn bạn.

Chỉnh sửa: Tôi nhận thấy rằng một số người nói về "thùng chứa gốc", Có vẻ như đó là khái niệm tôi đang tìm kiếm. Làm thế nào tôi nên thiết lập một container gốc và để cho các lớp ứng dụng khác biết điều đó?

Mẫu mã Edit2 (xin vui lòng tha thứ cho lỗi, nó chỉ là ví dụ rượu sake):

class SomeClass 
{ 
    public SomeClass() 
    { 
     Command cmd = new Command(); 

     cmd.execute(); 
    } 

} 

class SomeOtherClass:ISomeOtherClass 
{ 
public void allright() 
{ 
    //right 
} 
} 

class Command 
{ 
    ISomeOtherClass dependency; 

    void execute() 
    { 
    dependency.allright(); 
    } 

} 


Program.Main() 
{ 
    IKernel kernel = new StandardKernel(); 

    kernel.Bind<SomeClass>().ToSelf().InSingletonScope(); 
    kernel.Bind<ISomeOtherClass>().To<SomeOtherClass>(); 

    SomeClass sc = kernel.Get<SomeClass>(); 
} 

tôi đã không kiểm tra này được nêu ra, bởi vì tôi vẫn đang chiến đấu với một số vấn đề khởi tạo, nhưng câu hỏi của tôi là, làm thế nào lớp lệnh có thể biết về SomeOtherClass không? Giả thuyết hiện tại của tôi là tiêm hạt nhân vào SomeClass và sử dụng phương thức Tiêm.

Trả lời

11

Nhìn vào ví dụ của bạn, rõ ràng là SomeClass không được xây dựng với Inversion of Control; tip-off là nó có một sự phụ thuộc vào Command, nhưng kiểm soát của phụ thuộc đó được duy trì bên trong SomeClass chính nó. (Command cmd = new Command();)

Để đảo ngược kiểm soát của phụ thuộc đó, bạn sẽ cần phải có cách để tiêm phụ thuộc vào SomeClass. Như Remo Gloor has indicated, cách tiêu chuẩn để làm điều đó với Ninject là thông qua các nhà xây dựng.

Để làm như vậy, bạn có thể thay đổi SomeClass một cái gì đó như thế này:

class SomeClass 
{ 
    private ICommand _command; 

    public SomeClass(ICommand injectedCommand) 
    { 
     _command = injectedCommand; 
     _command.execute(); 
    } 

} 

Tương tự như vậy bạn sẽ cần lệnh của bạn để quảng cáo phụ thuộc của nó:

class Command 
{ 
    private ISomeOtherClass _dependency; 

    public Command(ISomeOtherClass injectedSomeOtherClass) 
    { 
     _dependency = injectedSomeOtherClass; 
    { 

    void execute() 
    { 
     _dependency.allright(); 
    } 
} 

Sau đó, bạn sẽ đăng ký Command ràng buộc trong hạt nhân, có lẽ như:

Program.Main() 
{ 
    IKernel kernel = new StandardKernel(); 

    kernel.Bind<SomeClass>().ToSelf().InSingletonScope(); 
    kernel.Bind<ICommand>().To<Command>(); 
    kernel.Bind<ISomeOtherClass>().To<SomeOtherClass>(); 

    SomeClass sc = kernel.Get<SomeClass>(); 
} 

Nhân sau đó hạt nhân sẽ có thể đi bộ ông phụ thuộc chuỗi và tiêm tất cả.

+0

Cảm ơn bạn đã trả lời nó có ý nghĩa, nhưng trong khi nó là chính xác, nó chỉ nói rằng tất cả các phụ thuộc phải được biết trước. Điều gì xảy ra khi điều này là không thể? (Tất nhiên những gì tôi nói có ý nghĩa chỉ khi các đối tượng được tạo động mà có thể xảy ra) – sebas

+0

giả sử rằng SomeClass phải tạo một số dứt khoát của các đối tượng động. Giống như SomeClass trở thành Level và nó phải tạo ra 30 ngôi sao. các ngôi sao có một số phụ thuộc, làm thế nào có thể Cấp tiêm những phụ thuộc vào các ngôi sao bằng cách sử dụng hạt nhân? – sebas

+0

Đó là một câu hỏi hay và bạn đang di chuyển ra ngoài các câu hỏi tiêm phụ thuộc đơn giản có thể được trả lời theo định dạng này. Loại tình huống này (tạo đối tượng phức tạp) có xu hướng đòi hỏi thêm một phần nữa, đó là lý do tại sao Remo đề cập đến các nhà máy trong câu trả lời của anh ta. Bạn nên điều tra hoặc tạo ra một nhà máy xây dựng sao và tiêm nó vào SomeClass, hoặc có Ninject giải quyết các ngôi sao bằng cách sử dụng một phương thức nhà máy riêng của mình hoặc Bind(). ToProvider(). –

5

Sử dụng phép xây dựng bất cứ khi nào có thể và Factories bất cứ khi nào có lý do chính đáng để không tạo các cá thể cùng với đối tượng phụ thuộc vào chúng.

kernel.Inject chỉ nên được sử dụng khi bạn không thay đổi việc tạo đối tượng. Ví dụ. một WebForm

kernel.Get nên được sử dụng chính xác một lần trong gốc thành phần của bạn (ví dụ: Program.Main hoặc MVC3.DependencyResolver) để tạo ứng dụng của bạn.

+2

Xin chào Remo! Cảm ơn bạn đã trả lời. Bạn cung cấp thông tin hữu ích, nhưng nó không phải là những gì tôi muốn biết. Bạn đang nói với tôi rằng Get không nên được sử dụng như là dịch vụ định vị, nhưng những gì tôi hỏi là nhiều hơn thế này: Hãy nói rằng tôi có một lớp học mà cần phải tạo ra một lệnh trong một trong những phương pháp của nó. Hãy nói rằng lệnh cần một số phụ thuộc được tiêm và hạt nhân đã được định nghĩa bên ngoài lớp tạo ra lệnh. Làm thế nào tôi nên sử dụng hạt nhân để tiêm phụ thuộc bên trong lệnh này? Trước tiên tôi có nên tiêm hạt nhân trong lớp tạo lệnh không? – sebas

+0

Vấn đề của tôi là một cái gì đó tương tự như http://stackoverflow.com/questions/2862698/ninject-shared-di-ioc-container này nhưng tôi sẽ không sử dụng bất kỳ lớp tĩnh nào, tôi thích tiêm hạt nhân vào thời điểm này. – sebas

+0

Bạn nên thêm một ví dụ mã vào câu hỏi của bạn về những gì bạn muốn làm. Mọi thứ khác chỉ là đoán. Thường phụ thuộc nên được thông qua bằng cách sử dụng constructor tiêm được thực hiện tự động bởi Ninject. –

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