2012-03-01 26 views
7

10 Khi cố định cấu hình ServiceStack.net để sử dụng Ninject làm IOC của nó, tôi nhận được lỗi đề cập đến các ràng buộc khác nhau không được xác định. Chủ yếu cho khách hàng ICache.Cách cấu hình Ninject để làm việc với ServiceStack.net

Cần phải tạo các ràng buộc cụ thể nào để sử dụng Ninject đúng cách?

Hiện nay đã xác định:

Bind<ISessionFactory>().To<SessionFactory>();//Is this correct/needed? 

Note

Tôi đã tạo ra một IContainerAdapter theo documention ServiceStack để thực hiện việc sử dụng Ninject. (Tìm thấy ở đây: ServiceStack IOC Docs)

Note 2 phương pháp apphost cấu hình của tôi trông như thế này:

public override void Configure(Funq.Container container) 
{ 
     IKernel kernel = new StandardKernel(new BindingModule()); 
     container.Adapter = new NinjectContainerAdapter(kernel); 
} 

Note 3

Tôi đã đăng ký ICacheClient như sau: Bind ().Đến();

Và bây giờ tôi nhận được một lỗi trỏ đến IRequest

Error activating IRequestLogger\nNo matching bindings are available, and the type is not self-bindable 

container Adaptor

public class NinjectContainerAdapter : IContainerAdapter 
{ 
    private readonly IKernel _kernel; 

    public NinjectContainerAdapter(IKernel kernel) 
    { 
     this._kernel = kernel; 
    } 

    public T TryResolve<T>() 
    { 
     return this._kernel.Get<T>(); 
    } 

    public T Resolve<T>() 
    { 
     return this._kernel.Get<T>(); 
    } 
} 

Trả lời

9

Bạn đã tiêm bộ tiếp hợp Container của mình với:

container.Adapter = new NinjectIocAdapter(kernel); 

Nếu có, hãy thử làm cho lớp AppHost của bạn nội bộ nếu bạn chưa làm như vậy. Chỉ nên có 1 phiên bản của AppHost và một số IOC muốn tạo ra cá thể riêng của họ, xóa sạch tất cả cấu hình từ phiên bản đầu tiên.

Hành vi bạn nhận được có vẻ như Ninject đang phàn nàn về các phụ thuộc chưa được giải quyết. Hãy chắc chắn rằng bạn sẽ có được Ninject để trở về null với phụ thuộc Unresolved bằng cách sử dụng kernal.TryGet<T> trong Adaptor container của bạn, ví dụ:

public T TryResolve<T>() 
{ 
    return this._kernel.TryGet<T>(); 
} 
+0

Có vui lòng xem ghi chú thứ hai của tôi ở trên. Đồng thời cố gắng thay đổi thành nội bộ không thành công – stephen776

+0

Thông báo lỗi: Lỗi kích hoạt ICacheClient \ nKhông có kết nối phù hợp nào có sẵn và loại không tự ràng buộc – stephen776

+0

Bạn đã đăng ký ICacheClient chưa? lưu ý việc sử dụng thuộc tính sử dụng giao diện TryResolve mà bộ điều hợp của bạn sẽ trả về null cho các phụ thuộc không tìm thấy/không đăng ký. Lỗi này giống như lỗi Ninject. Nếu không, bạn có thể đăng ký nó một cách rõ ràng với Bind (). (); nhưng trả về null là tốt hơn vì nó là hành vi mong đợi. – mythz

1

Bạn cần phải viết IContainerAdapter của riêng bạn và sau đó thiết lập Container.Adapter trong AppHost bạn

+0

Tôi đã làm điều này. Vui lòng xem chỉnh sửa ở trên. – stephen776

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