2015-06-16 40 views
19

Tôi có ứng dụng MVC 5 sử dụng Ninject và tôi thêm Hangfire vào nó.Cấu hình Hangfire và cấu hình Ninject

Khi tôi đã thêm Ninject, tôi đã sử dụng gói gói NinjectWebCommon vì tính đơn giản trong cấu hình. Vì vậy, bây giờ Ninject được cấu hình thông qua lớp NinjectWebCommon tạo ra một hạt nhân chuẩn và thêm các ràng buộc.

Hơn nữa tôi đã tạo ra một số mô-đun tùy chỉnh mà tôi tải khi tạo hạt nhân

private static IKernel CreateKernel() { 
    var kernel = new StandardKernel(new MyCustomModule()); 
    try { 
     kernel.Bind<Func<IKernel>>().ToMethod(ctx =>() => new Bootstrapper().Kernel); 
     kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>(); 

     RegisterServices(kernel); 
     return kernel; 
    } 
    catch { 
     kernel.Dispose(); 
     throw; 
    } 
} 

Các Ninject Web chung được đăng ký thông qua các lớp WebActivatorEx

[assembly: WebActivatorEx.PreApplicationStartMethod(typeof(MyProject.Web.NinjectWebCommon), "Start")] 
[assembly: WebActivatorEx.ApplicationShutdownMethodAttribute(typeof(MyProject.Web.NinjectWebCommon), "Stop")] 

Bây giờ vấn đề có liên quan về cách tạo Hangfire để xem cấu hình Ninject. Bằng cách nhìn vào gói Hangfire.Ninject tôi có thể đọc

Các gói phần mềm cung cấp một phương pháp mở rộng cho giao diện IGlobalConfiguration :

var kernel = new StandardKernel(); GlobalConfiguration.Configuration.UseNinjectActivator(kernel);

Bây giờ câu hỏi của tôi là:

  • Vì giao diện IGlobalConfiguration, tôi nên thêm cấu hình Hangfire Ninject bên trong phương thức khởi động OWIN (nơi cấu hình Hangfire đã được đặt). Làm thế nào tôi nên lấy hạt nhân Ninject hiện tại (cái mà NinjectWebCommon đã cấu hình?
  • Điều gì về thứ tự thực hiện? Là thực hiện WebActivatorEx trước hoặc sau khi khởi động OWIN?
  • Điều gì xảy ra nếu tôi cố gắng thực hiện cấu hình hai lần ?

Tổng quát hơn, làm thế nào tôi có thể chia sẻ cấu hình Ninject giữa hai?

Trả lời

10

Làm thế nào tôi sẽ nhận được Ninject hiện Kernel

Nhìn vào mã số Ninject.Web.Common.Bootstrapper cho thấy rằng nó lưu trữ một cá thể tĩnh đơn lẻ của hạt nhân và hiển thị nó qua thuộc tính Kernel. Điều này có nghĩa rằng bạn có thể làm điều này trong phương pháp khởi động OWIN:

GlobalConfiguration.Configuration.UseNinjectActivator(
            new Ninject.Web.Common.Bootstrapper().Kernel); 

và bạn sẽ có cùng IKernel dụ, hoàn thành với bất cứ điều gì ràng buộc bạn cấu hình trong NinjectWebCommon.RegisterServices

gì về thứ tự thực hiện ? Việc thực thi WebActivatorEx trước hoặc sau khi khởi động OWIN?

Trước đó. Bạn có thể xác minh điều này (như tôi đã làm) bằng cách thiết lập các điểm ngắt trong mỗi.More info

Nói chung, làm cách nào để chia sẻ cấu hình Ninject giữa hai?

Điều gì sẽ xảy ra nếu tôi cố thực hiện cấu hình hai lần?

Cấu hình hạt nhân là "gốc thành phần". Theo Mark Seemann, một chuyên gia ưu tú về chủ đề này, có should only be one of these in the applicationit should be as close as possible to the application's entry point.

+0

Chỉnh sửa: Đề xuất tùy chỉnh thay thế với đề xuất dựa trên Bootstrapper tốt hơn và thêm một chút vào gốc sáng tác. – CrazyPyro

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