Как внедрить объект в модуль Ninject - PullRequest
2 голосов
/ 05 ноября 2011

Я использую 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 для каждого загруженного модуля после загрузки всех модулей в ядре.

Но мои вопросы:

  1. Есть ли у Ninject эта функция внутри или нет?
  2. Вероятно, Ninject управляет этим делом внутри, и я мог бы вызвать RegisterManager в методе загрузки.Это правда?

1 Ответ

1 голос
/ 07 ноября 2011

Вы неправильно понимаете назначение модулей. Они там для настройки Ninject. У них самих вообще не должно быть никаких зависимостей. RegisterManager принадлежит где-то в службе или при запуске вашего приложения. Или, возможно, вам придется изменить способ работы диспетчера разрешений, чтобы он регистрировал все настроенные диспетчеры вместо их регистрации. Но почти невозможно определить, что лучше из вопроса - просто вы злоупотребляете модулями ради чего-то, для чего они не предназначены.

...