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