Nano Hash - криптовалюты, майнинг, программирование

Связывание Ninject в зависимости от запросов контроллера

Я только изучаю Ninject и как реализовать его в ситуации MVC. Я пытаюсь выяснить, как лучше всего настроить следующий сценарий.

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

На моей фабрике NinjectController в настоящее время у меня есть служба, которая разрешает команду в соответствующий репозиторий.

Bind<ITeamRepository>().To<SwimTeamRepository>() // non-space characters to enable edit submission

Но если запрос поступает от SoccerController, мне нужно выполнить привязку:

Bind<ITeamRepository>().To<SoccerTeamRepository>()

Нужно ли это делать условно, настраивать отдельные сервисы? Каков наилучший подход здесь? Или я совсем не в теме...


Ответы:


1

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

Это имеет больше смысла после редактирования. Я не совсем уверен, как структурировано ваше приложение, но я бы, вероятно, передал ITeamRepository контроллеру, и конструктор выглядел бы примерно так.

public SoccerController(ITeamRepository repository)
{
    _repository = repository;
}

public SwimmingController(ITeamRepository repository)
{
    _repository = repository;
}

А потом привязки:

Bind<ITeamRespository>().To<SoccerRepository>().WhenInjectedInto(typeof(SoccerController));
Bind<ITeamRespository>().To<SwimmingRepository>().WhenInjectedInto(typeof(SwimmingController));
06.05.2011
  • Обновлено, чтобы отразить последнюю версию Ninject и его документацию на github. Спасибо Рубен! 06.05.2011
  • Спасибо, Тимоти, это почти именно то, что я ищу, хотя я не был уверен, нарушает ли это какие-либо хорошие практики, поскольку кажется, что привязки жестко запрограммированы. Но будет ли эта привязка по-прежнему работать, если, например, у меня есть объект TeamList, который инициируется в каждом контроллере, так что, если я передаю в SwimRepository, он перечисляет пловцов, а если я передаю в SoccerRepository, он перечисляет футболистов? 09.05.2011
  • Я не уверен, что понимаю вопрос. Разве данные из TeamList не приходят из репозитория? Если это так, будет ли реализация SoccerRepository или SwimRepository возвращать правильный тип? 10.05.2011
  • Да, это так... Я думаю, что сейчас я просто запутался... Время для перерыва. Спасибо Тимоти! 10.05.2011

  • 2

    ответ @Timothy Strimple в основном правильный (поэтому мой +1 ) кроме:

    1. Это для Ninject v1 — сайт CodePlex должен исчезнуть, так как теперь все живет на github
    2. вы можете выразить тот факт, что используемая привязка зависит от задействованного контроллера с помощью условной привязки — в вики есть пример
    06.05.2011
  • Спасибо что подметил это. Это намного элегантнее, чем версия v1. 06.05.2011

  • 3

    В конструкторы вашего контроллера вы должны передать либо интерфейс, либо абстрактную реализацию типа, для которого Ninject предоставит конкретный тип.

    public SomeController(IRepositoryType repository) {
    }
    

    В классе NinjectControllerFactory у вас будет такая привязка:

    Bind.<IRepositoryType>()
        .To<DatabaseRepository>()
        ;
    

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

    Bind.<IRepositoryType>()
        .To<DatabaseRepository>()
        .WithConstructorArgument("connStr",
            "some_connection_string_here"
        );
    

    Надеюсь, это укажет вам правильное направление. ;

    06.05.2011
  • ... и я только что закончил свое предложение точкой с запятой. Думаю, мне нужно отойти от стола на несколько минут. знак равно 06.05.2011
  • Лол, я тоже так делаю, в электронных письмах и во всем! Спасибо за ответ. Это то, что я ищу, но более динамичная версия 09.05.2011
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..