2013-09-30 25 views
6

Ràng buộc hạt nhân Ninject giống như bạn biết.Ràng buộc phụ thuộc Ninject từ xml

kernel.Bind<IMyService>().To<MyService>(); 

Tôi muốn nhận MyService từ xml. WebConfig hoặc App.Config như thế này.

<add key="service" value="MyNamespace.MyService"> 

Tôi có thể nhận được chuỗi này trong mã. Nhưng Làm thế nào tôi có thể sử dụng nó

kernel.Bind<IMyService>().To<???>();

Hoặc Niniject có thể hỗ trợ này như mặc định?

Trả lời

6

Bạn có thể sử dụng quá tải To(Type) không chung chung.

loại Nhận từ app.config của bạn:

string service = ConfigurationManager.AppSettings["service"]; 
Type serviceType = AssemblyContainingYourType.GetType(service); 

Sử dụng các loại:

kernel.Bind<IMyService>().To(serviceType); 

Tất cả đã nói, hãy hiểu rằng Ninject khuyến khích mà bạn cấu hình các ràng buộc trong mã và không dựa vào tệp cấu hình.

+1

AssemblyContainingYourType? – barteloma

+0

Hội trong đó 'MyNamespace.MyService' được triển khai. – YK1

+1

Tại sao nó không được khuyến cáo? Có vẻ tốt hơn với XML, bởi vì bạn không phải biên dịch lại dự án của bạn – Marc

3

Tôi không tự sử dụng nó trong bất kỳ dự án nào của mình, nhưng có thể tiện ích mở rộng Ninject xml có thể hữu ích.

https://github.com/ninject/ninject.extensions.xml/wiki

<module name="myXmlConfigurationModule"> 
    <bind service="MyNamespace.IMyService, MyAssembly" 
      to="MyNamespace.MyServiceImplementation, MyAssembly" /> 
    <bind service="MyNamespace.IMyOtherService, MyAssembly" 
      to="MyNamespace.MyOtherServiceImplementation, MyAssembly" /> 
</module> 

Không chắc Mặc dù vậy, nếu bạn có thể lưu trữ nó trong một file App.config.

+0

Tôi đã sử dụng hạt nhân này.Load ("configuration.xml"); nhưng không hoạt động. – barteloma

+0

Xml trông như thế nào? Và lỗi là gì? Điều gì đã không hoạt động? – treze

+0

Lỗi kích hoạt IMyService Không có kết buộc phù hợp nào có sẵn và loại này không tự ràng buộc được. con đường Kích hoạt: 1) Yêu cầu IMyService Gợi ý: 1) Đảm bảo rằng bạn đã xác định một ràng buộc cho IMyService 2) Nếu các ràng buộc được định nghĩa trong một module, đảm bảo rằng các mô-đun đã được nạp vào kernel . 3) Đảm bảo bạn đã không vô tình tạo nhiều hơn một hạt nhân. 4) Nếu bạn đang sử dụng đối số hàm tạo, hãy đảm bảo rằng tên tham số khớp với tên thông số của hàm tạo. 5) Nếu bạn đang sử dụng tải mô-đun tự động, hãy đảm bảo đường dẫn tìm kiếm và bộ lọc là chính xác – barteloma

0

Cuối cùng có giải pháp Đừng quên đặt Sao chép thành đầu ra của thuộc tính Thư mục tệp xml của tệp này thành Sao chép nếu mới hơn, sao cho nó có thể được sao chép vào thư mục đầu ra tự động. for more

1

Ninject kernel ràng buộc là như thế này: -

Tạo XML như dưới đây: -

<module name="myXmlConfigurationModule"> 
    <bind service="MyNamespace.IMyService, MyAssembly" 
      to="MyNamespace.MyServiceImplementation, MyAssembly" /> 
    <bind service="MyNamespace.IMyOtherService, MyAssembly" 
      to="MyNamespace.MyOtherServiceImplementation, MyAssembly" /> 
</module> 

Sau đó Code: -

using Ninject; 

    enter code here 

    class ABC 
     { 
      public void CallingMethodUsingNinject() 
      { 
       private IKernel kernel= new StandardKernel(); 
       kernel.Load("yourXmlFileName.xml"); 
       bool ismodule = kernel.HasModule("myXmlConfigurationModule");//To Check The module 
       if(ismodule) 
       {   
       IMyService MyServiceImplementation = kernel.Get<IMyService>(); 
       MyServiceImplementation.YourMethod(); 
       } 
      } 
     } 

Một số bạn có thể phải đối mặt với vấn đề do tập tin XML cài đặt thuộc tính vì vậy cần thay đổi cài đặt tệp xml của bạn. Lỗi kích hoạt dịch vụ IMyService Không có kết buộc phù hợp nào có sẵn và loại này không tự ràng buộc được. Giải pháp: -Đừng quên đặt Copy to Output sở hữu thư mục của file xml này để sao chép nếu mới hơn, để nó có thể được sao chép vào thư mục đầu ra tự động

Để biết thêm: -read https://www.packtpub.com/sites/default/files/9781782166207_Chapter_02.pdf

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