2012-05-04 21 views
6

Tôi là người mới sử dụng Ninject và tôi không thể tìm ra cách tiêm vào trình xử lý http chung của mình. Tôi có một dự án MVC3 và tôi đang tiêm dịch vụ của mình vào bộ điều khiển mà không có vấn đề gì cả. Đây là những gì tôi có trong lớp Ninject App_start tôi đăng ký dịch vụ:Làm thế nào để tiêm vào một số trình xử lý http asp.net chung sử dụng Ninject?

 private static void RegisterServices(IKernel kernel) 
    { 
     kernel.Bind<NLSubscriber.Core.Service.Repository.INLUserRepository>().To<NLSubscriber.Core.Service.Repository.EFDAL.EFNLUserRepository>().InRequestScope(); 
     kernel.Bind<Neticon.Mvc.Helpers.IConfigHelper>().To<Neticon.Mvc.Helpers.AzureEnabledConfigHelper>().InSingletonScope(); 
     kernel.Bind<Neticon.Security.Service.IAuthenticationService>().ToMethod(m => Neticon.Security.Service.SecurityServiceFactory.CreateAuthenticationService()).InRequestScope(); 
     kernel.Bind<Neticon.Security.Service.IMembershipService>().ToMethod(m => Neticon.Security.Service.SecurityServiceFactory.CreateMembershipService()).InRequestScope(); 
     kernel.Bind<Neticon.Security.Service.IRoleManagerService>().ToMethod(m => Neticon.Security.Service.SecurityServiceFactory.CreateRoleManagerService()).InRequestScope(); 

Khi tôi cố gắng để có được một số dịch vụ từ xử lý chung của tôi bằng cách sử dụng tiêm tài sản (với [tiêm] thuộc tính) Tôi luôn luôn nhận được null. Đây là cách xử lý của tôi trông giống như:

public class SubscriberHandler : IHttpHandler 
{ 
    [Inject] 
    public INLUserRepository userRep { get; set;} 

    public void ProcessRequest(HttpContext context) 
    { 
     var users = userRep.GetUsers(); //userRep is always null here 
    } 


    public bool IsReusable 
    { 
     get 
     { 
      return false; 
     } 
    } 
} 

Tôi cũng đã cố gắng làm việc đó như thế này:

readonly INLUserRepository userRep; 

    public SubscriberHandler() 
    { 

     using (IKernel kernel = new StandardKernel(new App_Start.NJRepositoryModule())) 
     { 
      userRep = kernel.Get<INLUserRepository>(); 
     } 
    } 

nhưng tôi nhận được một ngoại lệ:. "Lỗi tải Ninject phần ICache Không thành phần như vậy có Gợi ý: 1) Nếu bạn đã tạo một lớp con tùy chỉnh cho KernelBase, hãy đảm bảo rằng bạn đã thực hiện đúng cách triển khai phương thức AddComponents() 2) Đảm bảo rằng bạn đã không xóa thành phần khỏi container qua cuộc gọi đến Xoá bỏ hết(). 3) Đảm bảo bạn đã không vô tình tạo ra nhiều hơn một hạt nhân."

Đó là gợi ý với tôi rằng tôi không được phép khởi tạo nhiều hơn một hạt nhân trong ứng dụng của tôi, phải không? Tôi đang làm gì sai? Cảm ơn

+1

Bản sao có thể có của http://stackoverflow.com/questions/3629472/httphandler-property-injection-using-ninject-returning-null – Andreas

Trả lời

3

Bạn có thể sử dụng phân giải phụ thuộc:.

public class SubscriberHandler : IHttpHandler 
{ 
    public INLUserRepository userRep { get; private set; } 

    public SubscriberHandler() 
    { 
     userRep = DependencyResolver.Current.GetService<INLUserRepository>(); 
    } 

    public void ProcessRequest(HttpContext context) 
    { 
     var users = userRep.GetUsers(); //userRep is always null here 
    } 

    public bool IsReusable 
    { 
     get 
     { 
      return false; 
     } 
    } 
} 

tôi đang mong đợi để có được thông tin phản hồi tiêu cực từ câu trả lời này bởi vì các mô hình dịch vụ định vị được xem bởi nhiều như một mô hình chống

Nhưng tôi không chắc liệu NInject có cho phép bạn sử dụng phép xây dựng cho trình xử lý HTTP vì chúng được khởi tạo bởi thời gian chạy ASP.NET hay không.

+0

Cảm ơn Darin. Điều này làm việc cho tôi bây giờ. Về mô hình chống, như bạn có thể thấy, tôi đã vượt qua điều đó ... Ý tôi là, việc sử dụng thuộc tính tiêm hoặc bất kỳ tham chiếu trực tiếp nào khác tới Ninject cũng không phải là một điều hay. Một bình luận mặc dù, tôi đã làm cho userRep riêng tư chỉ đọc, không cần phải công khai ... –

+2

Sẽ không có 1 người cố gắng giúp đỡ (ngay cả khi họ cho mọi người biết cách sử dụng SL!), Nhưng câu trả lời này là một sự lừa đảo của http : //stackoverflow.com/a/3629684/11635 và câu hỏi là một dup của quá này –

+0

@RubenBartelink, trong liên kết song song bạn đã đăng họ sử dụng 'ServiceLocator.Current.GetInstance (); 'trong khi trong ví dụ của tôi tôi sử dụng 'DependencyResolver.Current.GetService ();' là một lớp ASP.NET MVC 3 cụ thể. –

5

Gốc thành phần cho IHttpHandler s là IHttpHandlerFactory. Bạn có thể tạo một tuỳ chỉnh IHttpHandlerFactory sử dụng Ninject để tạo một phiên bản IHttpHandler của bạn. Bằng cách đó bạn có thể sử dụng tiêm constructor.

+0

Bạn có thể gắn điều này vào http://stackoverflow.com/questions/3629472/httphandler-property-injection-using-ninject-returning-null và VTC vui lòng không . –

+1

Remo, bạn có ví dụ minh họa điều này ở bất kỳ đâu không? –

+0

Xin chào, có bất kỳ mã mẫu nào cho điều này không. Làm thế nào để chúng ta có thể xử lý. – veshu

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