【发布时间】:2010-06-03 12:22:37
【问题描述】:
我有一个可以在不同提供商中搜索的搜索表单。 我从拥有一个基本控制器开始
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 才能在 Twitter 中搜索,到 /News 才能在新闻中搜索......这意味着我应该根据我所在的选项卡更改表单的操作参数,并在表单返回时显示正确的选项卡取决于.. 网址?疯狂随之而来。
如果您已经构建了类似的东西或知道什么是最好的方法,欢迎提出建议。
现在我认为使用表单中的参数并发布到单个控制器会减轻痛苦。我正在考虑根据此参数注入正确的 SearchService 。最好的方法是什么?我想到了使用模型活页夹,
所以我的 ActionMethod 应该是这样的:
public ActionResult Search(ISearchService service, Query query)
{
var results = service.Find(query);
}
但我认为需要在 ModelBinder 中进行这样的调用
ObjectFactory.GetInstance(...);
基于描述要使用哪个提供程序的查询字符串参数,这对我来说似乎并不优雅。我觉得卡住了,求助:(。
【问题讨论】:
标签: asp.net-mvc design-patterns dependency-injection