Инъекционная зависимость от InApplicationStarted - PullRequest
0 голосов
/ 08 апреля 2011

Я использую сервис из моего OnApplicationStarted внутри моего файла Global.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");
        }
    }
}

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

1 Ответ

1 голос
/ 08 апреля 2011

Вы можете переопределить метод 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);
}
...