Вопрос внедрения при использовании Ninject 2 в приложении ASP.NET MVC - PullRequest
1 голос
/ 19 декабря 2009

Я использую Ninject 2 с веб-приложением ASP.NET MVC. Все зависимости должным образом обрабатываются в стеке (Controllers-> Services-> Repositories). Однако у меня есть некоторые классы в проекте Services, которые не входят в эту «цепочку», которые я также хочу добавить при запуске приложения. Как мне заставить Ninject их узнать? У меня есть общедоступные свойства с атрибутами [Inject], но когда приложение запускается, они нулевые. Чего мне не хватает?

Вот мой класс MvcApplication:

public class MvcApplication : NinjectHttpApplication
{
    protected override void OnApplicationStarted() {
        RegisterRoutes(RouteTable.Routes);
        RegisterAllControllersIn(Assembly.GetExecutingAssembly());
    }

    protected override IKernel CreateKernel() {
        var modules = new INinjectModule[] {
            new Services.ServiceModule(),
            new Data.DataModule()
        };

        var kernel = new StandardKernel(modules);

        return kernel;
    }

    // route registration removed
}

Я дважды проверил оба модуля, чтобы убедиться в наличии правильных привязок.

Образец из модуля:

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

Ответы [ 2 ]

2 голосов
/ 19 декабря 2009

Чтобы Ninject мог внедрить зависимости, вы должны создать объект, используя ядро. Это легко для объектов в цепочке естественных зависимостей (т. Е. В вашем приложении Controllers-> Services-> Repositories), но может оказаться сложным для тех, кто находится за его пределами.

Вы должны либо добавить дополнительные типы в качестве зависимостей одного из типов, созданных в естественной цепочке, либо каким-либо образом получить обработчик ядра и вызвать Get . Для этого вам, возможно, придется использовать статический сервисный локатор.

0 голосов
/ 19 декабря 2009

Вы переопределяете CreateKernel ()? Тебе нужно сделать это и сделать твое связывание там.

...