У меня есть форма поиска, которая может искать в другом провайдере.
Я начал с базового контроллера
public SearchController : Controller
{
protected readonly ISearchService _searchService
public SearchController(ISearchService searchService)
{
_searchService= searchService;
}
public ActionResult Search(...)
{
// Use searchService to query and return a view.
}
}
и дочерние контроллеры
TwitterController : SearchController
{
...
}
NewsController : SearchController
{
...
}
Я использую StructureMap, чтобы вставить все мои зависимости в контроллер. С помощью этой настройки я смог изменить SearchService в зависимости от типа устанавливаемого контроллера.
x.For<ISearchService>().ConditionallyUse(o =>
{
o.TheDefault.Is.OfConcreteType<NewsSearchService>();
o.If(c => c.ParentType == typeof(TwitterController))
.ThenIt.Is.OfConcreteType<TwitterSearchService>();
...
});
Это даже позволило мне установить различные представления для каждого контроллера (просто поместив соответствующую папку (Twitter, News ...), а родительский контроллер все еще обрабатывает весь поиск, с помощью простого
return View(results)
, который отображает правильное представление, специфичное для твиттера, новостей или других
Теперь, когда это было круто и выглядело великолепно, у меня есть одна форма, и различные представления отображаются во вкладках на одной странице. Вот где это начинает усложняться при таком подходе. Форма должна публиковаться в / Twitter для поиска в твиттере, в / News для поиска в новостях ... что означает, что я должен изменить параметр действия формы в зависимости от того, какая вкладка у меня есть, и отображать правильную вкладку, когда форма возвращается в зависимости от .. URL? следует сумасшествие.
Если вы уже создали что-то подобное или знаете, как лучше всего к этому подойти, пожалуйста, советы.
Теперь я думаю, что мне было бы меньше проблем с использованием параметра в форме и отправкой на один контроллер. Я думаю о введении правильного SearchService в зависимости от этого параметра. Какой будет лучший подход? Я думал об использовании модельного связующего,
Итак, мой ActionMethod будет выглядеть так:
public ActionResult Search(ISearchService service, Query query)
{
var results = service.Find(query);
}
Но я думаю, что нужно сделать такой вызов в ModelBinder
ObjectFactory.GetInstance(...);
На основе параметра строки запроса, который описывает, какого поставщика использовать, и который не кажется мне более элегантным. Я чувствую себя застрявшим, помогите: (.