Я использую Ninject для DI.У меня есть Ninject Модули, которые связывают некоторые сервисы с Ядром и используют связанный объект в других модулях как сервис.Чтобы прояснить ситуацию, давайте рассмотрим несколько строк кода: это мой модуль безопасности.Он предоставляет сервис с именем PermissionManagerContainer
.
public class SecurityModule : NinjectModule
{
public override void Load()
{
Bind<IPermissionManagerContainer>().To<PermissionManagerContainer>().InSingletonScope();
}
}
С другой стороны, у меня есть модуль FormServices
, который должен добавить элемент к введенному PermissionManagerContainer
.Я думаю, что код должен быть примерно таким:
public class FormServicesModule : NinjectModule
{
[Ninject.Inject]
private IPermissionManagerContainer permissionManagerContainer { get; set; }
public override void Load()
{
permissionManagerContainer.RegisterManager(formServicesPermissionManager);
}
}
Итак, на странице с именем ManagePermissions.aspx
я снова внедряю PermissionManagerContainer
и создаю пользовательский интерфейс для менеджеров разрешений всех модулей.Например, мне нужно защитить формы в моем модуле FormServices и определить разрешения для каждой формы в этой службе.
Но я думаю, что нет никаких гарантий для связывания PermissionManagerContainer
перед внедрением его в другой модуль!
На самом деле, у меня есть собственное решение этой проблемы.Я могу написать абстрактный класс с именем MyModule, который подклассифицирован из NinjectModule, и написать абстрактный метод с именем InitializeModule.и вызовите RegisterManager
в этом методе.Затем вызовите InitializeModule для каждого загруженного модуля после загрузки всех модулей в ядре.
Но мои вопросы:
- Есть ли у Ninject эта функция внутри или нет?
- Вероятно, Ninject управляет этим делом внутри, и я мог бы вызвать
RegisterManager
в методе загрузки.Это правда?