我有一個可以在不同提供程序中搜索的搜索表單。 我開始了由具有基本控制器根據查詢字符串/派生控制器注入不同的存儲庫並根據控制器類型注入存儲庫/ 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>();
...
});
,即使讓我爲每個控制器設置不同的意見,(只是把相應的文件夾(推特,新聞...)和父控制器仍然是處理所有的搜索,用一個簡單的
return View(results)
這顯示特定嘰嘰喳喳正確的觀點,新聞,或其他
現在很冷靜,看起來很棒,我一個單一的形式和不同的視圖顯示在同一頁面上的標籤。這就是它這種方法開始變得複雜表單必須發佈到/ Twitter在Twitter中進行搜索,以/ News在新聞中搜索...這意味着我應該根據哪個選項卡更改表單的操作參數,並在表單返回時顯示正確的選項卡在..的網址?瘋狂如下。
如果你已經建立了這樣的東西,或知道什麼是最好的辦法,請大家指教。
現在我想我會有更少的痛苦使用窗體中的參數併發布到單個控制器。我正在考慮根據此參數注入正確的SearchService。最好的方法是什麼?我想用一個模型綁定的,
所以,我有我的ActionMethod看起來像這樣的:
public ActionResult Search(ISearchService service, Query query)
{
var results = service.Find(query);
}
但我認爲需要做這樣的呼籲在ModelBinder的
ObjectFactory.GetInstance(...);
基於描述使用哪個提供程序的querystring參數,對我來說看起來並不高雅。 。我覺得卡住,幫助:(
Erf,實際上這並不適合。我會有很多工廠,因爲我的SearchService具有更多的依賴關係,這些依賴關係也可以通過結構圖來解決。我會通過使用這個工廠失去所有的好處,最終我會手動完成結構圖爲我所做的所有工作。 – 2010-06-03 13:25:31
看到我的其他建議。你怎麼看? – 2010-06-03 13:36:04
這真的是我應該去的方式嗎?那隻會刪除我的IOC的所有用途......並且我會根據抽象工廠中的一個參數手動連接我的所有成員? – 2010-06-04 14:03:32