Как использовать Ninject с параметрами запроса в MVC? - PullRequest
1 голос
/ 05 февраля 2011

Я слежу за книгой Стивена Сандерсона Pro MVC2 и у меня есть вопрос об использовании Ninject.

В примере со спортивным магазином мы имеем в Global.asax.cs

 ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory());

и NinjectControllerFactory определяется как:

public class NinjectControllerFactory : DefaultControllerFactory

{
    //A Ninject "kernet" is the thing that can supply object instances
    private IKernel kernel = new StandardKernel(new SportsStoreServices());


    protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
    {
        return (IController)kernel.Get(controllerType); 
    }

    private class SportsStoreServices : NinjectModule
    {
        public string QString = null;
        public override void Load()
        {

            Bind<IProductsRepository>().To<SqlProductsRepository>()
                .WithConstructorArgument("connectionString", ConfigurationManager.ConnectionStrings["AppDb"].ConnectionString);


        }
    }

}

Как видите, SqlProductsRepository берет строку подключения из файла конфигурации.Если мне нужно принять решение на основе параметров строки запроса URL, например, если param1 = true, я хочу загрузить данные из одного хранилища в сравнении с другим, как я могу это сделать?Я пытался увидеть, как получить доступ к параметрам запроса в методе Load(), но я не могу найти заранее заполненное место для этого.

Также Load() является правильным местом для принятия решения на основе параметров запросаили я должен как-то принять это решение в контроллере?

Ответы [ 2 ]

1 голос
/ 05 февраля 2011

Можно иметь несколько привязок, которые имеют .WithMetadata (или его особый случай .Named()). Затем при разрешении необходимо передать фильтр метаданных и / или параметр имени в вызов .Get<>(), чтобы указать привязки. Небольшой, но поиск здесь приведет к примерам, но, безусловно, лучший источник неосновных примеров - это непродолжительные тесты, которые действительно чистые и одна из причин, по которой неопытные документы не получают той любви, которой они заслуживают (то есть обновление v2).

То есть, вы добавляете фильтр имени или метаданных в качестве дополнительного параметра в:

    return (IController)kernel.Get(controllerType, **here**); 

Что касается передового опыта, как управлять этим в более сложных ситуациях, я лично прочитал бы набор постов Бренда Уилсона о том, как они это делали в MVC 3.

Полагаю, это зависит от пункта назначения и целей:

  1. заставить образец сделать что-то, пока вы учитесь - набросок выше
  2. рассортируйте архитектуру на основе DI, чтобы сделать вас счастливыми, запустить и купить Внедрение зависимостей в .NET от Mark Seemann , настоятельно рекомендуем ASP.NET MVC 3 и прочитать серию статей Брэда Уилсона в любом случае
0 голосов
/ 08 февраля 2011

метод Load () модуля вызывается только при запуске приложения и инициализации ядра.следовательно, нет контекста запроса для принятия решения.

если бы это был я, я бы вставил оба репозитория в контроллер и заставил бы контроллер принимать решения по использованию.таким образом, вы можете написать модульные тесты, чтобы убедиться, что он принимает правильные решения.

...