Я не полагаю, что это принадлежит контроллера, потому что, после того как это встраивается там, это не может выйти.
я думаю, что MVC должен иметь введенный промежуток другого слоя: уровень служб, который отображается на варианты использования. Это содержит бизнес-логику, знает о единицах работы и транзакциях, и имеет дело с моделью, и персистентность возражает для выполнения ее задач.
контроллер имеет ссылку на сервис, что это должно выполнить свой вариант использования. Это волнуется о немаршалинге запросов в объекты, с которыми сервис может иметь дело, называет сервис и упорядочивает ответ для передачи обратно представлению.
С этим расположением, сервис применим самостоятельно даже без пары контроллера/представления. Это может быть локальным или удаленным объектом, упакованным, и развернуло любой способ, которым Вы желаете, что контроллер имеет дело с.
контроллер теперь становится связанным более тесно к представлению. В конце концов, контроллер, который Вы будете использовать для рабочего стола, вероятно, будет отличаться, чем тот для веб-приложения.
я думаю, что этот дизайн более для обслуживания широкого круга запросов.
Для справки, если кто-то еще столкнется с этой проблемой, вот мое решение:
IList<string> ALL_TYPES = new[] { "article", "blog", "forum" };
string q = ...; // The user's search string
IList<string> includeTypes = ...; // List of types to include
Query searchQuery = parser.Parse(q);
Query parentQuery = new BooleanQuery();
parentQuery.Add(searchQuery, BooleanClause.Occur.SHOULD);
// Invert the logic, exclude the other types
foreach (var type in ALL_TYPES.Except(includeTypes))
{
query.Add(
new TermQuery(new Term("type", type)),
BooleanClause.Occur.MUST_NOT
);
}
searchQuery = parentQuery;
Я инвертировал логику (т.е. исключил типы, которые пользователь не выбрал), потому что, если вы не • порядок результатов теряется. Я не уверен, почему ...! Обидно, потому что это делает код менее понятным / поддерживаемым, но, по крайней мере, он работает!
Добавьте ограничения для отклонения документов, которые не были выбраны. Например, если была проверена только «статья», ограничение было бы
-(type:forum type:blog)
Хотя предложение Эриксона кажется правильным, вы можете использовать положительное ограничение AND с вашим термином поиска, например text: foo AND type: article
только для случая «article» был проверен,
или text: foo AND (type: article OR type: forum)
для случая, когда были проверены и «article», и «forum».