本來我打算采用ajax提交請求,異步的請求獲取數據,但是我發現如果這樣的話就會拖慢開發的進度,拖長時間。所以在這篇博客中仿照首頁的列表設計其實和左側列表網站分類采用了同樣的方式,通過局部視圖的方式呈現。
我在顯示的時候采用了htmlHelper的RenderAction方法,至於我為什么特別喜歡用這個方法來組件一個頁面?我的回答可能就是個人喜好,畢竟我看的Mvc書籍中也沒有說必須采用哪種方法,或者哪種方法更好,但是我記得在哪個博客中看到過html.Action和html.RenderAction的性能差異?RenderAction的性能會好那么一點點?只是一點點。所以我記住了這個方法,如果沒有特別說明,我一直都是采用這種做法。如果您有其他意見,可以提出來,畢竟我的知識有限,可能存在錯誤。
在開始之前我還想啰嗦依據,就是我在第一篇博客中說過,會采用到IOC、Nhibernate等框架來協同的開發這個小型的網站,我一般采用的方式都是先采用原始的方式操作,然后再通過采用這些框架來展示它們強大的威力。這樣更容易理解,也更有說服力。當然,我沒有當過老師,可能我的這種做法是錯的,但是我當過學生,我個人認為這樣是一個好的方式。還是那句話,如果您有更好的意見,歡迎您提出來,我會積極改進。
言歸正傳,下面開始:
首先我們來分析一下博客園的首頁列表設計,在列表中最主要的就是標題、簡略的內容(說到內容,我想起來在設計數據庫的時候有園友提出來,可以把內容單獨的放到一個表中,這樣便於Lucene.net建立索引。我對他的意見也很同意,但是我最后還是把博客內容放到了博客表中。因為我發現如果單純的把博客內容放到一個單獨的表,因為我發現我我在做博客園的找找看功能的時候也是可以通過查詢數據庫來建立索引,放到單獨表中可能增加靈活性,符合數據庫設計規范,但是我認為好的設計不一定會完全符合數據庫設計(比如冗余),我並不是說我的數據庫設計很好,到現在為止,我也在不斷的調整數據庫,插曲)、作者(用戶名)、發布時間、評論次數、閱讀次數,這些數據顯示。當然下面還需要一個分頁,我現在先不采用Ajax方式異步請求,我先采用MVCPager進行分頁,以后在完成這些小功能進行重構的時候我們再一起修改成ajax。或者我修改成ajax,提交代碼,大家看一下,因為畢竟這個分頁沒有什么好說的。網上有現成的分頁代碼,每個公司也都會有。
通過分析,博客標題、內容、發布時間我們可以從博客表中取得數據,用戶名需要通過該博客AuthorID查找對應的AuthorName,評論次數則可以通過評論表、閱讀次數可以通過博客閱讀次數表來獲取,具體的數據表結構我就不細說了。
我們在項目要采用Autofac(IOC組件)來進行依賴注入,通過構造函數注入,避免在需要的地方需要逐個的定義類的實例。關於IOC—AutoFac,我打算下次專門做一個小例子來顯示一下。博客園中關於Autofac的講解也有很多。
既然要使用Autofac,那么我們就需要注冊類型。首先我們在global.asax中注冊接口以及實現類。
public void ReigsterOnApplicationStart()
{
var builder = new ContainerBuilder();//構造一個容器
var iservices = Assembly.Load("IServices"); //Iservices是所有提供具體實例的接口所在命名空間
// builder.RegisterAssemblyTypes(iservices);
var data=Assembly.Load("ImpServices");//這個是具體實現類命名空間
// builder.RegisterAssemblyTypes(data).AsImplementedInterfaces().SingleInstance();這種方式表示會創建單個實例,也就是設計模式中的單例模式,在整個的應用程序中只有唯一的實例存在
builder.RegisterControllers(Assembly.GetExecutingAssembly());//注冊所有的controller
var container = builder.Build();//創建具體的實例
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));//設置MVC框架的依賴注入解析器為AutofacDependencyResolver並且將注冊的類型實例傳入 這就是MVC的擴展一方面
}
在定義好了或者說配置好了AutoFac以后,就需要在應用程序初始化的時候進行注冊,這樣這些變量才可以在程序啟動的時候就開始工作。在Application_start方法中進行注冊。
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
ReigsterOnApplicationStart();//注冊AutoFac
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
通過以上方式就可以在程序中使用Autofac框架所帶來的便利,當然會有網友大呼,那么簡單,的確通過這些配置(或者應該叫注冊,因為配置很容易聯想到XML)就可以輕松的實現依賴注入,在程序中進行使用了。
我在中間多說一句,這些框架使用起來都很簡單,但是要正確的使用還是要花些功夫的,畢竟web form如果只是托控件,確實比Java要簡單一萬倍,這也就是Java程序員有時會看不起我們.Net程序員的原因我想。但是真正在實際的項目中,正確的使用,那我們真要仔細研究一下。
在我們注冊了Autofac之后,就可以使用了?我們通過構造函數注入(依賴注入方式分三種:屬性注入、構造函數注入、接口注入)來應用到本項目中。
因為我們目前要實現的功能是首頁中間列表功能,所以我們就以這個為例。
首先我們要創建BlogController負責所有的與博客相關的邏輯。在新建好BlogController之后,我們要創建BlogController的構造函數,如果不使用AutoFac,我們根本不需要創建BlogController的構造函數。我會在代碼后面進行必要的注釋
public class BlogController : Controller
{
//
// GET: /Blog/
private readonly IBlogServices _blogServices;//定義博客服務類接口
public BlogController(IBlogServices blogServices)//BlogController的構造函數,里面會傳遞一個IBlogServices (博客服務類BlogServices的接口)
{
this._blogServices = blogServices;
}
public IBlogServices BlogServices
{
get
{
return _blogServices;
}
}
public ActionResult Index(int pageNo, int pageSize)
{
IBlogServices blogServices = BlogServices;//我在這里是通過屬性值獲取到傳遞進來的實例變量
List<BlogInfo> listBlog = blogServices.GetBlogListWithPageNo(pageNo, pageSize);//調用具體實例類BlogServices的方法返回必要的數據,這里返回的就是需要在首頁顯示的數據 PageNo表示頁數,PageSIze表示每頁顯示的個數
ViewBag.BlogList = listBlog;//我通過Viewbag進行值的傳遞,有的園友提出來我為什么不采用在View(object)這種方式傳遞,我的回答是采用View(object)需要在View層定義這種類型,我一般習慣在View層定義類而不是這種List<BlogInfo>的形式(個人習慣,沒有好壞之分)
return View();
}
}
我說了那么多我自己看了都很討厭的話,其實我不是一個說話很多的人。現在來看一個例子表示我沒有說假話吧
首頁列表可以正常的顯示了,但是里面還有一些細節我還沒有來得及處理。比如點擊推薦按鈕數值就要加一,通過點擊評論可以到達詳細內容頁的評論列表。這些細節問題我都會慢慢解決。畢竟這才是最浪費時間的地方。
總結一下把,在這篇博客中說是介紹首頁列表顯示,倒不如說是顯示了一下如何簡單利用Autofac進行依賴注入,算是意外收獲吧。關於依賴注入的相關知識,還請大家參考園中其他高手的博客。我也會在近期整理一下我的筆記,把其中我發現的一些問題描述一下,雖然寫這些字很快,但是准備很費時間啊,希望園友們不要責怪我沒有很好的完全這個功能的全部。
代碼我已經托管到codeplex,有興趣的朋友可以一起討論,一起開發。
http://www.cnblogs.com/jiagoushi/archive/2012/12/08/2809152.html 在這篇博客中可以找到
索引:
Asp.net MVC 仿照博客園的簡單網站首頁 列表設計 (2012-12-11 22:21) | ||||||
為什么要從Web form過渡到MVC中 (2012-12-09 22:43) | ||||||
Asp.net MVC3 企業網站系統高仿博客園 首頁左側列表頁面 實現效果 (2012-12-08 19:11) | ||||||
Asp.net MVC 3 開發企業網站系統仿照博客園部分功能--總體設計 (2012-12-05 23:41) | ||||||
Asp.net MVC 3 開發簡單的企業系統開篇--數據庫 (2012-12-03 21:03) | ||||||
Asp.net MVC 3 開發一個簡單的企業網站系統 |