У меня есть форма поиска, которая может искать в разных провайдерах. Я начал с базового контроллера
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 для поиска в twitter, в /News для поиска в новостях... что означает, что я должен изменить параметр действия формы в зависимости от того, на какой вкладке я нахожусь, и отобразить правильную вкладку, когда форма возвращается в зависимости от.. url? сумасшествие следует.
Если вы уже создали что-то вроде этого или знаете, какой лучший подход к этому, пожалуйста, совет приветствуем.
Теперь я думаю, что у меня будет меньше боли, используя параметр в форме и отправку на один контроллер. Я думаю о том, чтобы ввести правильный SearchService в зависимости от этого параметра. Какой был бы лучший подход? Я думал о том, чтобы использовать модельное связующее,
Итак, у меня бы появился ActionMethod:
public ActionResult Search(ISearchService service, Query query)
{
var results = service.Find(query);
}
Но я думаю, что нужно было бы сделать такой вызов в ModelBinder
ObjectFactory.GetInstance(...);
На основе параметра querystring, который описывает, какой поставщик использовать, и который не кажется мне более изящным. Я чувствую, что застрял, помогите: (.