在人民網:http://news.people.com.cn/GB/124421/index.html ,新華網:http://www.xinhuanet.com/xhzb/index.htm等網站都有文字直播。昨天剛剛完成了學校六十校慶上用的文字直播系統,當然不是使用MVC做的。今天我再使用ASP.NET MVC3+EF+JQuery完善一下這個系統,也作為Entity Framework 4 in Action讀書筆記系列前期的一個例子吧。
建立解決方案和項目
1. 首先,建立一個空的解決方案
解決方案的名稱為:LiveText,如:
2. 建立完解決方案,還需要建立三個項目,具體如下面的表格:
| 項目名稱 |
Visual Studio項目模板 |
用途 |
LiveText.Domain |
C#類庫 |
儲存域的實體和邏輯 |
LiveText.WebUI |
ASP.NET MVC 3 Web Application |
儲存控制器和視圖 |
LiveText.UnitTests |
Test Project |
單元測試 |
3. 添加引用
我們的項目中使用到了Ninject,Moq工具類庫,首先需要添加對它們的引用,簡便的方法是使用VS的Package Manager Console(View ➤ Other Windows ➤Package Manager Console),輸入下面的命令:
Install-Package Ninject -Project LiveText.WebUI
Install-Package Ninject -Project LiveText.UnitTests
Install-Package Moq -Project LiveText.UnitTests
具體如:
具體項目之間的依賴關係如下表:
| 項目名稱 |
工具依賴 |
項目依賴 |
LiveText.Domain |
沒有 |
沒有 |
LiveText.WebUI |
Ninject |
LiveText.Domain |
LiveText.UnitTests |
Ninject,Moq |
LiveText.Domain,LiveText.WebUI |
4. 設定依賴注入容器
項目中,我們使用Ninject建立控制器和處理依賴注入(DI)。在LiveText.WebUI項目中建立一個Infrastructure的檔案夾,在該檔案夾中建立一個NinjectControllerFactory類,代碼如下:
public class NinjectControllerFactory : DefaultControllerFactory{ private IKernel ninjectKernel; public NinjectControllerFactory() { ninjectKernel = new StandardKernel(); AddBindings(); } protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) { return controllerType == null ? null : (IController)ninjectKernel.Get(controllerType); } private void AddBindings() { }}
然後修改Global.asax如下
protected void Application_Start(){ AreaRegistration.RegisterAllAreas(); RegisterGlobalFilters(GlobalFilters.Filters); RegisterRoutes(RouteTable.Routes); //修改的這個地方 ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory());}
效果如:
至此,項目的基本架構就做完了,下面設計資料庫。
設計資料庫
這裡使用EF Code-First。
1. 編寫實體類
人民網的文字直播系統分為“國新辦發布會直播”、“國台辦發布會直播”等類別,每個類別下面又有很多直播的內容。文字直播系統大體需要這幾個實體類:
Category —— 類別類 Title —— 標題類
Text —— 文字類 User —— 使用者類
在LiveText.Domain項目中建立一個檔案夾Entities,在該檔案夾中建立上面四個類:
public class Category{ /// <summary> /// 類別編號 /// </summary> public int CategoryID { get; set; } /// <summary> /// 類別名稱 /// </summary> public string Name { get; set; } /// <summary> /// 標題集合 /// </summary> public ICollection<Title> Titles { get; set; }}
public class Title{ /// <summary> /// 標題編號 /// </summary> public int TitleID { get; set; } /// <summary> /// 標題名稱 /// </summary> public string Name { get; set; } /// <summary> /// 所屬類別 /// </summary> public Category Category { get; set; } /// <summary> /// 文字集合 /// </summary> public ICollection<Text> Texts { get; set; }}
public class Text{ /// <summary> /// 文字編號 /// </summary> public int TextID { get; set; } /// <summary> /// 發言人 /// </summary> public string Prolocutor { get; set; } /// <summary> /// 發言內容 /// </summary> public string ProContent { get; set; } /// <summary> /// 日期 /// </summary> public DateTime ProDate { get; set; } /// <summary> /// 所屬標題 /// </summary> public Title Title { get; set; }}
public class User{ /// <summary> /// 使用者編號 /// </summary> public int UserID { get; set; } /// <summary> /// 使用者名稱 /// </summary> public string UserName { get; set; } /// <summary> /// 使用者密碼 /// </summary> public string Password { get; set; }}
2. 添加EFCodeFirst
在Package Manager Console中輸入命令:
Install-Package EFCodeFirst -Project LiveText.Domain
3. 建立上下文類
在LiveText.Domain項目中,建立名為Concrete的檔案夾,在該檔案夾中建立一個LiveTextDbContext的類,它繼承自System.Data.Entity.DbContext,具體代碼如下:
public class LiveTextDbContext : DbContext{ public DbSet<Category> Categories { get; set; } public DbSet<Title> Titles { get; set; } public DbSet<Text> Texts { get; set; } public DbSet<User> Users { get; set; }}
4. 修改Web.config
開啟LiveText.WebUI項目的Web.config,添加一個資料庫連接字串,name的值要和上下文類的名稱一樣。
<connectionStrings> <add name="LiveTextDbContext" connectionString="Data Source=.;Initial Catalog=LiveText;Integrated Security=True;Pooling=False" providerName="System.Data.SqlClient"/> </connectionStrings>
建立一個HomeController,添加如下代碼:
public class HomeController : Controller{ LiveTextDbContext context = new LiveTextDbContext(); // // GET: /Home/ public ActionResult Index() { var categories = context.Categories; return View(categories); }}
給Index添加一個View,如:
現在就可以運行了,運行結果如下:
再看看資料庫裡,EF已經為我們自動產生了資料庫,資料庫的結構如:
至此,我們資料庫的設計就完成了。
原始碼:http://files.cnblogs.com/nianming/LiveText201110131625.rar