Проблема с привязкой / отменой привязки - PullRequest
1 голос
/ 07 декабря 2011

У меня есть небольшая дилемма, которая, честно говоря, является крайним случаем, но все еще создает проблему.

В настоящее время я использую Ninject MVC и связываю все свои контроллеры следующим образом:

Kernel.Bind<SomeController>.ToSelf();

, который работает для 99% вещей, которые мне нужно было сделать, однако в данный момент я делаю некоторые дурацкие вещи, связанные с динамической маршрутизацией и динамическими контроллерами, которые требуют, чтобы я вручную написал метод для получения типа контроллера от ниндзя. Сначала я думал, что это будет легко, но это не так ... Я ожидал, что смогу получить контроллер на основе его имени, но это не сработало.

Kernel.Get<IController>("SomeController");

Это заставило меня подумать, что это, вероятно, потому что он знает только о привязке к SomeController, а не IController. Поэтому я подумал, что могу написать все свои привязки так:

Kernel.Bind<IController>.To<SomeController>().Named("SomeController");

Таким образом, будет легко получить тип контроллера из имени, выполняющего предыдущий код, однако, если бы я связал этот путь, у меня возникла бы проблема, когда я пришел, чтобы отсоединить контроллеры (так как плагины могут быть загружается и выгружается во время выполнения). Итак, нормально:

Kernel.Unbind<SomeController>()

Что было здорово, больше не будет работать, и мне придется сделать:

Kernel.Unbind<IController>();

Однако потом я понял, что мне нужно дать ему какое-то ограничение, чтобы сообщить ему, какую привязку для этого типа я хочу отсоединить, и, похоже, для этого нет перегрузок или DSL ...

Так что я нахожусь в ловушке между камнем и наковальней, так как мне нужно удовлетворить метод ControllerLookup, но также и сохранить его, чтобы я мог легко добавлять и удалять привязки во время выполнения.

protected override Type GetControllerType(RequestContext requestContext, string controllerName) { 
//... find and return type from ninject
}

У кого-нибудь есть идеи?

(Просто задайте всем вопросы, почему я это делаю, из-за способа загрузки плагинов, Ninject знает о типах и пространствах имен, но в контексте создания контроллера он не знает пространство имен только имя контроллера, поэтому я делаю это, чтобы удовлетворить изоляцию плагина и расположение динамического контроллера, это окольный способ сделать это, но это то, что люди делали с AutoFac до Пример аналогичной вещи с AutoFac )

1 Ответ

3 голосов
/ 07 декабря 2011

По моему мнению, привязки должны быть созданы один раз при запуске приложения и больше не изменяться после первого разрешения. Все остальное может привести к странным проблемам. Если у вас нет надлежащей изоляции с использованием AppDomain для каждого плагина, вы все равно не сможете разгрузить их. Вместо выгрузки привязок вы можете сделать их условными и отключить их, используя некоторую конфигурацию.

Если вы действительно хотите выгрузить привязки, то я предлагаю не делать это для одиночных привязок, а использовать преимущества модулей. Загрузите все привязки, принадлежащие одному плагину, в один или несколько модулей и выгрузите эти модули вместо отдельных привязок.

...