我有一個ASP.NET MVC項目,它使用服務項目來通過一組接口(項目)到一個存儲庫項目。使用ASP.NET MVC和服務層Ninject
我對使用Ninject的地方略感困惑。在我看來,我將Ninject包含在服務層中是合乎邏輯的,因爲這是我與接口交互的地方。
我的問題是如何實施?另外,其他人怎麼實現這個?
我有一個ASP.NET MVC項目,它使用服務項目來通過一組接口(項目)到一個存儲庫項目。使用ASP.NET MVC和服務層Ninject
我對使用Ninject的地方略感困惑。在我看來,我將Ninject包含在服務層中是合乎邏輯的,因爲這是我與接口交互的地方。
我的問題是如何實施?另外,其他人怎麼實現這個?
在您的Services項目中,您將希望創建一個派生自NinjectModule的類並重載Load方法;這個類的職責是向Ninject註冊你的依賴關係。
public class ServiceModule : NinjectModule
{
public override void Load() {
Bind<IAccountService>().To<AccountService>();
}
}
然後,您需要創建一個繼承自NinjectHttpApplication的Application類。重寫CreateKernel方法,並從你的服務項目註冊NinjectModule(你可能需要註冊任何人相處。
public class MvcApplication : NinjectHttpApplication
{
protected override void OnApplicationStarted() {
RegisterRoutes(RouteTable.Routes);
RegisterAllControllersIn(Assembly.GetExecutingAssembly());
}
protected override IKernel CreateKernel() {
var modules = new INinjectModule[] {
new MyProject.Services.ServiceModule(),
new MyProject.Data.DataModule()
};
var kernel = new StandardKernel(modules);
return kernel;
}
從理論上講,唯一的地方使用DI容器是在項目的設置。在一個ASP.NET MVC項目的情況下,這將是在Global.asax的Application_Start方法中。我的項目,我使用的是基於NInject的ControllerFactory根據需要實例化控制器,然後控制器有他們在構造函數需要的任何依賴關係因此NInject將它們正確地掛鉤。
my global.asax:
private static IKernel kernel = new StandardKernel();
protected void Application_Start()
{
kernel.Bind<IRepository<User>>().To<NHibernateRepository<User>>();
ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory(kernel));
}
和我NInjectControllerFactory:
public class NinjectControllerFactory : System.Web.Mvc.DefaultControllerFactory
{
private IKernel container;
public NinjectControllerFactory(IKernel container)
{
this.container = container;
}
protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
if (controllerType != null)
{
IController controller = container.Get(controllerType) as IController;
Check.Require(controller, "Could not instantiate controller type: {0}", controllerType.FullName);
return controller;
}
return base.GetControllerInstance(requestContext, controllerType);
}
}
筆記,使用NinjectHttpApplication,你需要擴展代碼:http://github.com/ninject/ninject.web.mvc – 2010-07-15 16:39:18
這就是我也推薦... – Haroon 2011-04-12 22:10:57