2010-07-15 3 views
1

У меня есть проект ASP.NET MVC, который использует проект служб, чтобы пройти через набор интерфейсов (проектов) к проекту репозитория.с использованием Ninject с ASP.NET MVC и уровнем услуг

Я немного смущен, где использовать Ninject. Мне кажется логичным, что я включаю свой Ninject в уровень сервисов, так как здесь я взаимодействую с интерфейсами.

Вопрос в том, как это реализовать? Кроме того, как это сделали другие люди?

ответ

4

В проекте «Услуги» вы захотите создать класс, который происходит из NinjectModule и переопределить метод Load; ответственность этого класса заключается в регистрации ваших зависимостей с помощью Ninject.

public class ServiceModule : NinjectModule 
{ 
    public override void Load() { 
     Bind<IAccountService>().To<AccountService>(); 
    } 
} 

Затем вы захотите создать класс приложения, который наследуется от NinjectHttpApplication. Переопределить метод 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 –

+0

Это то, что я хотел бы также рекомендовать... – Haroon

1

Теоретически, единственное место, чтобы использовать DI контейнер в настройках проекта. В в случае проекта ASP.NET MVC, который будет использоваться в методе Application_Start в Global.asax. Для моего проекта я использую контроллер на основе NInject ControllerFactory для создания контроллеров по мере необходимости, а затем контроллеры имеют любые зависимости, которые им нужны в своих конструкторах поэтому NInject соответствующим образом подключает их.

мой 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); 
    } 
} 
Смежные вопросы