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