Ninject вводит зависимость от OnApplicationStarted

#asp.net-mvc #asp.net-mvc-3 #ninject

#asp.net-mvc #asp.net-mvc-3 #ninject

Вопрос:

Я использую сервис из моего OnApplicationStarted внутри моего глобального файла.ascx.cs. Есть ли способ внедрить зависимость в репозиторий оттуда?

Мой код:

 public class MvcApplication : NinjectHttpApplication
{
    //Need to dependency inject this.
    private IBootStrapService bootService;

    protected override void OnApplicationStarted()
    {
        //Used to set data such as user roles in database on a new app start.
        bootService.InitDatabase();

        base.OnApplicationStarted();

        AreaRegistration.RegisterAllAreas();
        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);
    }

    internal class SiteModule : NinjectModule
    {
        public override void Load()
        {
            //I set my bindings here.
            Bind<IBootStrapService>().To<BootStrapService>();
            Bind<IUserRepository>().To<SqlServerUserRepository>()
                .WithConstructorArgument("connectionStringName", "MyDb");
        }
    }
}
  

Итак, как мне заставить ninject выполнять DI прямо в запуске приложения? Как вы можете видеть, я настраиваю свои привязки в SiteModule классе.

Ответ №1:

Вы могли бы переопределить CreateKernel метод, в котором вы регистрировали бы свои модули:

 protected override IKernel CreateKernel()
{
    return new StandardKernel(
        new INinjectModule[] 
        { 
            new SiteModule()
        }
    );
}
  

Однако это не приведет к автоматическому вводу bootService поля. Вы могли бы создать ее экземпляр следующим образом:

 protected override void OnApplicationStarted()
{
    base.OnApplicationStarted();

    //Used to set data such as user roles in database on a new app start.
    var bootService = Kernel.Get<IBootStrapService>();
    bootService.InitDatabase();

    AreaRegistration.RegisterAllAreas();
    RegisterGlobalFilters(GlobalFilters.Filters);
    RegisterRoutes(RouteTable.Routes);
}
  

Комментарии:

1. Значит, после выполнения именно этого сервис будет внедрен до выполнения кода в OnApplicationStarted?

2. @Lol coder, нет, в этом случае bootService не будет вводиться автоматически, потому что это часть Http-приложения, и Ninject не имеет контроля над его созданием. Вы могли бы внедрить ее вручную. Я обновлю свой пост, чтобы показать пример.