2010-07-15 91 views
1

我有一個ASP.NET MVC項目,它使用服務項目來通過一組接口(項目)到一個存儲庫項目。使用ASP.NET MVC和服務層Ninject

我對使用Ninject的地方略感困惑。在我看來,我將Ninject包含在服務層中是合乎邏輯的,因爲這是我與接口交互的地方。

我的問題是如何實施?另外,其他人怎麼實現這個?

回答

4

在您的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; 
    } 
+0

筆記,使用NinjectHttpApplication,你需要擴展代碼:http://github.com/ninject/ninject.web.mvc – 2010-07-15 16:39:18

+0

這就是我也推薦... – Haroon 2011-04-12 22:10:57

1

從理論上講,唯一的地方使用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); 
    } 
}