2012-02-06 23 views
14

Có thể sử dụng ninject để tiêm phụ thuộc theo cách sao cho kết quả sẽ giống như tiêm tôi có thể nhận được trong MVC hay không. Để xây dựng, nếu tôi sử dụng bộ chuyển đổi MVC ninject tôi có thể khai báo bộ điều khiển web của tôi là có tham số constructor mà sau đó sẽ tự động được tiêm bởi ninject.Tiêm xây dựng Ninject trong WPF

Tuy nhiên, tôi đã không tìm thấy như một phần mở rộng Ninject cho WPF, mà sẽ cho phép tôi để có một cửa sổ như thế này:

public partial class MainWindow : Window 
{ 
    private readonly IService injectedService; 
    public MainWindow(IService injectedService) 
    { 
     this.injectedService = injectedService; 
    } 
} 

Tôi muốn làm điều này mà không sử dụng một cách rõ ràng IKernel trong tôi khởi động ứng dụng chính để có được một thể hiện của mainwindow. Tôi muốn sử dụng phương pháp thông thường của cấu hình xaml để có được một thể hiện của cửa sổ chính và tất cả các cửa sổ tiếp theo.

Điều này có khả thi không? Có cách nào để móc vào việc tạo đối tượng được tạo ra bởi xaml để sửa đổi nó để sử dụng Ninject cho việc tiêm phụ thuộc constructor hay không.

+2

Tôi không nghĩ rằng một phần mở rộng như vậy tồn tại, bởi vì trong WPF bạn thường sử dụng mô hình MVVM và do đó sẽ tiêm các dịch vụ vào các lớp ViewModel của bạn. –

+0

Nhưng không phải là các mô hình tự tạo ra thông qua XAML là tốt? Phải thừa nhận rằng, tôi không phải là một chuyên gia về WPF nhưng sẽ không phải là các mô hình sau đó cần phải cùng một loại tiêm phụ thuộc? Tôi lo ngại về việc có container của tôi hiển thị mà sẽ cản trở thử nghiệm đơn vị của dự án. – Dervall

+3

Không, các Chế độ xem không được tạo trong XAML. Chúng được tạo trong ViewModelLocator, xem [ở đây] (http://windowsphonegeek.com/articles/Working-with-a-simple-ViewModelLocator-from-MVVM-Lite) để biết ví dụ. Chế độ xem hoặc Chế độ xem của bạn không biết bất kỳ điều gì về vùng chứa phụ thuộc của bạn. –

Trả lời

17

Dựa trên nhận xét & sự nhầm lẫn của bạn, có vẻ như MVVM phù hợp với bạn. Thách thức là, HỌC MVVM.

Vì vậy, hãy mở một số good link và cuộn. MVVM thật dễ dàng để làm, và nó khá dễ dàng để bọc nó với Ninject và đặt một cây cung trên đó.

Đường cong học tập ban đầu nếu bạn KHÔNG sử dụng thư viện của bên thứ ba cho Ninject + MVVM như tôi đã làm, hơi dốc. Vì vậy, đây là một vài điều tôi đã hiểu:

 DataContext="{Binding Path=ResultViewModel,Source={StaticResource ServiceLocator}}" 

Ngoài chút này làm cho phép bạn để kích hoạt Ninject để có được thông tin viewmodel của bạn từ XAML của bạn:

<Application.Resources> 
    <ioc:NinjectServiceLocator x:Key="ServiceLocator" /> 
</Application.Resources> 

mẹo nhỏ cho phép bạn gán staticresource từ tệp app.xaml của bạn đến lớp có liên quan

public class NinjectServiceLocator 
{ 
    private readonly IKernel kernel; 

    public NinjectServiceLocator() 
    { 
     kernel = new StandardKernel(new MyMvvmModule()); 
    } 

    public ResultViewModel ResultViewModel 
    { 
     get { return kernel.Get<ResultViewModel>(); } 
    } 
} 

Điều này đáng chú ý. Mỗi viewmodel phải được liệt kê như là một thuộc tính trong ServiceLocator để cho Ninject tạo ra chúng. Cuối cùng, MyMvvmModule trong ví dụ trên là lớp Ninject tiêu chuẩn, nơi bạn ghi đè lên hàm Load() và ràng buộc tất cả các giao diện của bạn.

+0

Cảm ơn bạn, rất hữu ích – Dervall

+1

@Dervall Cảm ơn bạn. Bài viết này là những gì tôi nghĩ rằng Jeff Atwood hình dung cho SO. Tôi đã có một vấn đề tương tự, vì vậy tôi chia sẻ thông tin tôi phát hiện ra sau khi nghiên cứu nó trong nhiều giờ, tiết kiệm bất cứ ai trong tương lai rất nhiều thời gian tôi hy vọng. – deltree

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