#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 не имеет контроля над его созданием. Вы могли бы внедрить ее вручную. Я обновлю свой пост, чтобы показать пример.