Связывание Ninject в зависимости от запросов контроллера - PullRequest
8 голосов
/ 06 мая 2011

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

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

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

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

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

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

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

Ответы [ 3 ]

12 голосов
/ 06 мая 2011

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

Это имеет больше смысла после редактирования. Я не совсем уверен, как у вас структурировано ваше приложение, но я бы, вероятно, передал 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));
4 голосов
/ 06 мая 2011

@ Ответ Тимоти Стриппла в значительной степени правильный (отсюда мой +1), за исключением:

  1. Это для Ninject v1 - сайт CodePlex должен исчезнуть, как и все теперь живет на github
  2. Вы можете выразить тот факт, что привязка к использованию зависит от контроллера, задействованного через условное связывание - есть пример в вики
1 голос
/ 06 мая 2011

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

public SomeController(IRepositoryType repository) {
}

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

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

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

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

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

...