Linux.NET學習手記(4)


前一回合中我們已經對Jexus作了一個詳細深入的學習,如果各位讀者有仔細的閱讀文章並且有進行實際的操作,相信玩轉Jexus這款高性能服務器軟件絕對並非難事,至此為止,Jexus的學習到此結束,我們也正式的進入到下一個學習的正題當中。

前面幾個回合以來,我們一直都在Linux.NET的邊緣中徘徊,始終都沒有部署過任何的一個.NET的網站應用程序,為的就是讓讀者們先弄清楚Linux.NET到底是怎么一回事,同時也讓各位讀者對Linux.NET或多或少的有一些了解,所謂“萬丈高樓平地起”,如果在沒有任何基礎的情況下直接在Linux中部署.NET網站應用程序,這將會遇到不少的困擾。這里我建議各位打算學習Linux.NET的讀者們,應當先對Asp.NET和Linux的操作有一定的了解,畢竟本系列的文章並不是單純的講解Asp.NET,也不是Linux的使用教程,而是建立在它們共同之上的一種領域。此外各位讀者也應當懂得怎么使用Jexus(或其他能夠提供.NET運作的Linux服務器軟件),這樣子我們才能夠以一種比較輕松的方式來共同的對Linux.NET進行學習。

在今后我們將會把一些已經在Windows中寫好的ASP.NET網站進行嘗試性的向Linux遷移部署,看它們能否成功的從Windows向Linux遷移,遷移后是否滿足我們的需求,當然,由於Windows和Linux終歸是兩種不同的系統,遷移的過程中會遇到各種各樣的阻力,這需要我們的讀者見招拆招,在不斷的摸索中令我們的Linux.NET大軍能夠不斷挺進。同時各位讀者如有任何關於Linux.NET的心得體會,在Linux中部署.NET的技巧,歡迎各位讀者進行分享;本文中如有不科學的地方,也歡迎各位讀者留言指正。

正式進入到本回合的正題,案例代碼可以點擊這里下載:

在本回合中,我們將討論學習:

  (1)、在Mono中部署一個簡單的在線加法器

  (2)、結合數據庫,在Mono中部署一個簡單的增刪查改站點

  (3)、在Mono中使用輕量的ORM——PetaPoco


1、牛刀小試

在進行各種大中小規模的.NET部署之前,我們先來進行一次的超小規模的.NET部署測試,讓各位讀者先體驗一下在Mono中運行.NET網站是怎么一回事。當然,我們現在部署東西會比知名的“Hello World”高級一點,我們將要部署的是一個簡單的CodeBehind加法計算器。

針對本回合的所有實驗,我們新開一個Jexus的虛擬主機:

然后在Windows中的Visual Studio寫一個簡單的網站。

Default.aspx
 1 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
 2 
 3 <!DOCTYPE html>
 4 
 5 <html xmlns="http://www.w3.org/1999/xhtml">
 6 <head runat="server">
 7 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
 8     <title></title>
 9 </head>
10 <body>
11     <form id="form1" runat="server">
12     <div style="background-color:pink;height:40px;width:600px;padding:10px;">
13         <asp:TextBox ID="Addend1" runat="server"></asp:TextBox>  +
14         <asp:TextBox ID="Addend2" runat="server"></asp:TextBox>
15         <asp:Button ID="Sum" runat="server" Text="=" OnClick="Add" />
16         <asp:TextBox ID="Result" runat="server" ReadOnly="true"></asp:TextBox>
17     </div>
18     </form>
19 </body>
20 </html>
Default.aspx.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected void Add(object sender, EventArgs e)
    {
        int a = Convert.ToInt32(Addend1.Text);
        int b = Convert.ToInt32(Addend2.Text);
        Result.Text = (a + b).ToString();
    }
}

最后把網站發布到Linux中指定的根目錄(/var/www/Linux.NET4/)中,並重啟Jexus。

成功的訪問並計算~~~!!!

這里有幾個需要提醒的地方:

  (1)、部署完.NET之后,Jexus需要重啟才能生效(至少要對部署的網站進行重啟)

  (2)、習慣使用Apache的,特別是習慣使用或者最近一直都在使用動態語言的讀者,要留意編譯型和解析型語言的區別。站點內容必須放置在Jexus配置的指定根目錄中,換句話就是:bin、app_code等文件夾所在的目錄級別必須是網站的根目錄。在下就曾經犯二的把.NET的一個網站放到了非Jexus網站根目錄的一個文件目錄中,結果編譯發布之后老報找不到XXX的錯誤,結果郁悶了老半天才恍然大悟。

  (3)、各位讀者可以自由選擇“直接采用源碼上傳到Jexus中發布”或者“本地編譯發布網站,再上傳編譯后的網站到Jexus中”。如果目標Linux是處於局域網中,各位讀者還可以直接采用samba等軟件把網站根目錄文件夾共享出來,這可以更方便的上傳發布網站。

 

2、PostgreSQL與Mono的結合

一個網站(除靜態站點)的正常運行必然是需要和數據進行打交道的,我舉個例子,比如我們現在去淘寶買一本書,當我們登陸時,淘寶需要對我們的登陸信息進行驗證,驗證我們的用戶名密碼是否正確;當我們需要搜索需要的商品時,淘寶需要對我們需要的產品進行篩選,並把篩選后的結果推送到我們的瀏覽器供我們查閱;瀏覽了好一陣子之后,我們發現自己想要的心水商品時,然后點擊下單並填寫配送信息,淘寶還需要登記下我們的配送地址、聯系電話等相關信息……可以看出,從我們輸入淘寶這一網址並回車這一剎那開始,我們就不斷的和淘寶進行各種的數據交互,我們的每一個操作,無論是登陸、下單還是搜索、翻閱,全部都涉及到大量的數據交互。各位讀者是否有想過,我們在網站中干了那么多的事情,填寫了這么多的表單信息,淘寶又是怎樣把我們的信息記錄下來,又應該記錄到哪里?Of Course,各位讀者答得非常好,它就是通過淘寶網的數據庫進行記錄下來的。

而事實上,我們當今在網上遇到的除靜態網站之外的大部分站點(包括任何的在線論壇、網上商城、XXX的發布系統……),它們都需要對用戶的操作進行或簡單或詳細的記錄,而這些信息記錄必然是需要通過某種存儲方式保存到服務器中,因此數據庫都是是它們的共同的最佳選擇,不同的只是它們可能並不是使用同一種的數據庫而是其它各種類型的,Ms SQLServer、MySQL、DB2或者是一些非關系型的NOSQL數據庫。

在寫本篇文章之前,我就一直在考慮,《Linux.NET學習手記》應該采用那一款的數據庫,到底是使用我在Linux中一直使用的MySQL還是我所認知的那些擁有豐富Linux.NET開發經驗的前輩們普遍使用的PostgreSQL。網上關於MySQL和PostgreSQL對比的文章也有不少,講得比較精辟的有:《PostgreSQL和MySQL的對比》《MySQL VS PostgreSQL》。最后經過再三思考之后,我決定選擇使用PostgreSQL,選擇該數據僅僅是基於一些個人(私人的)原因。各位讀者未必也必須要使用PostgreSQL,可以按照自己的喜好和業務的需求來選擇自己心水的數據庫軟件,順帶的呼吁一下:各位讀者請不要作任何的數據庫之爭,因為數據庫之爭就跟語言之爭一樣毫無意義,從來就沒有哪款數據庫好哪款數據庫不好的這么一個說法,只有在哪個領域或者哪個項目之中哪款更合適。

好的,說得有點多了。關於如何在Linux下部署PostgreSQL,這里我推薦兩篇園子中的文章,它們分別是介紹使用yum和源碼包的方式部署PostgreSQL:《CentOS 6.3 Minimal yum 安裝 PostgreSQL 9.2.3》《CentOS 6.3 Minimal 源碼安裝 PostgreSQL 9.2.3》,各位讀者可以自行的選擇喜歡的方式部署PostgreSQL。另外,由於本文的重點並不是介紹PostgreSQL如何使用,因此各位讀者如果不懂如何使用PostgreSQL的,可以自行的從網上搜索相關的資料(我個人手頭上也有少量的關於PostgreSQL的資料,有需要的讀者可以發站內信或在微博上私信或@我)。

首先,我們先在建立我們的數據庫和表,這里我不介紹數據庫和表如何建立,只是給出表的結構,其結構如下:

然后在我們的解決方案中新建一個新的網站“Example2” ,添加上我們需要的PostgreSQL的連接器,各位讀者可以點擊這里,鏈接到官網上上下載或通過其他辦法來獲取該工具包。

在這里我們通過另外的一種方式,采用Visual Studio所提供的便捷功能”NuGet“來快速的獲取並自動部署到我們的網站項目中。

使用方法非常簡單,只需點擊:”工具-->庫程序包管理器-->庫程序包控制台“調出控制台,然后在控制台中輸入"Install-Package Npgsql"並回車執行即可。

這樣,我們就可以通過NuGet非常簡單並且快速的把PostgreSQL的連接器”Npgsql“部署到我們的項目當中。

然后我們在配置文件”Web.Config“中添加上PostgreSQL的連接字串:

<?xml version="1.0"?>
<configuration>
  <connectionStrings>
    <add name="postgres" connectionString="Host=127.0.0.1;User ID=postgres;Password=postgres;database=test"/>
  </connectionStrings>
  <system.web>
    <compilation debug="true" targetFramework="4.0"/>
  </system.web>
</configuration>

接着我們在采用最簡單的辦法寫出增、刪、查、改的代碼(這里不作粘貼展示,各位讀者請移步到項目代碼中查看)。接着我們再發布並上傳網站,通過操作得出我們需要的結果:

 這里有幾點注意需要提醒各位讀者:

  (1)、使用NuGet部署“Npgsql”時,要注意控制台中部署項目是否正確選中我們需要部署的項目。

  (2)、如果各位讀者的Mono與PostgreSQL不是安裝到同一台的Linux中,需要注意數據庫的授權問題,更詳細的各位讀者可以閱讀PostgreSQL的手冊,上面有詳細的概述。

  (3)、網站上傳之后各位讀者別忘了把Jexus重啟。

 

3、Mono中使用PetaPoco

微軟的ADO.NET技術給予了我們對數據庫的操作極大的方便,無論我們面對的是何種的數據庫,只要這款數據庫的廠商有提供基於.NET的連接器,我們都可以采用ADO.NET的五大對象(Connection、Command、Reader、Adapter、DataSet)再配上通用的“T-SQL”語句來連接並操作這款數據庫。我們幾乎可以在不認識這款數據庫的情況下完成對改數據庫的操作,當然,我這里所說的操作指的是通用的“T-SQL”的操作,對於數據庫的特色(特有的)高級功能或者另外一些不支持“T-SQL”的數據庫,采用這種方法就未必適用了。

盡管ADO.NET已經是極大的方便了,但我們仍然免不了許多繁瑣的工作,我們仍然需要一遍又一遍的對“T-SQL”語句進行拼接,一遍又一遍的調用我們寫好的SQLTool(或SQLHelper),如果數據庫中表比較少問題還尚算不大,但是如果數據庫中的表很多,達到幾十或上百個,這種“上螺絲”的操作不僅會花費我們大量的編碼時間,還讓我們的編碼樂趣下降。還有更可悲的,那就是直接使用這些原生方法得到的結果返回集是一個弱類型的數據集,我們使用的時候還很可能的需要對返回的數據集進行逐一的數據類型轉換,我們或許還要重新翻開數據庫或者字段定義表來查閱該數據到底是一個什么類型。

面對這種情況,使用ORM(對象關系映射)可以很好的在一定程度上解決我們現有的問題,我們可以通過配置XML文檔的方式(如果使用“Code-First”之類的技術甚至連配置XML還可以免除)把數據庫中的表與我們項目中的實體類進行映射,我們就可以非常容易的得到一些強類型數據集,此外不少的ORM框架還會內置一些我們常用的CRUD的方法,一些甚至連常用數據庫的連接器也內置,給予了我們極大的便利。

Entity Framework(以下簡稱ef),它是微軟提倡使用的一款ORM框架,相信應該有不少讀者知道並且懂得怎么使用,特別是做過.NET MVC開發的讀者,ef更是MVC的標配,我自己也非常喜歡這款ORM框架,無論是它的姓名還是它的性能。但是本文中不會簡介如何在Mono中使用ef來對PostgreSQL進行實體映射,原因非常簡單,Mono中的ef框架比微軟在Windows中正式發布的版本要高了整整一個版本。微軟當前發布的ef正式版本為ef5,而Mono中存在的ef版本卻是ef6,並且Mono還不支持低於ef6的ef框架。雖然各位讀者也可以在NuGet控制台中通過“Install-Package EntityFramework -Prerelease”來獲得處於未發行的ef6框架,但是正因為它還沒有發行,如果各位讀者強行的把此版本的ef框架部署到項目當中,PostgreSQL(包括MySQL)的數據庫連接器都會因為版本問題而無法被ef識別,最終還是無法使用該ORM框架對數據庫進行操作。

 既然現有的ef無法對PostgreSQL提供支持,而我們又想使用ORM框架,那就得尋找ef的替代品,在尋尋覓覓的過程中,我從一位網友隨口報的一款輕量級ORM框架中找到了答案。沒錯,這款框架就是小節標題上寫的“PetaPoco”。關於PetaPoco的介紹和使用方法,各位讀者可以參考:PetaPoco官網.NET對象關系映射器PetaPocoOoC's Blog,它們都有比較清晰而詳細的介紹PetaPoco如何使用,各位讀者可以點擊鏈接並學習。

 我們為本小節實驗新建一個新的網站“Example3”。

然后再添加上我們的PetaPoco庫,各位的讀者可以從PetaPoco的官網上獲取,在這里,我們仍然使用 Visual Studio 提供的快捷功能,使用NuGet控制台來在線的獲取並把PetaPoco部署到我們的網站項目當中。它的命令為:”Install-Package PetaPoco“。

然后在我們的網站配置文件”Web.Config“中添加好我們的連接字串

Webb.Config
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <connectionStrings>
    <add name="postgres" connectionString="Host=127.0.0.1;User ID=postgres;Password=postgres;database=test"/>
  </connectionStrings>
  <system.web>
    <compilation debug="false" targetFramework="4.0" />
  </system.web>
</configuration>

在Model中添加上我們的”Person“實體類:

Person.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using PetaPoco;

/// <summary>
/// Person 實體類
/// </summary>
[PetaPoco.TableName("person")]
[PetaPoco.PrimaryKey("id")]
public class Person
{
    [PetaPoco.Column("id")]
    public int ID { get; set; }

    [PetaPoco.Column("name")]
    public string Name { get; set; }

    [PetaPoco.Column("age")]
    public int Age { get; set; }

    [PetaPoco.Column("sex")]
    public string Sex { get; set; }

}

跟第二節一樣,添加一個Aspx頁面,添加”增“、”刪“、”查“、”改“四個按鈕並完善里面的代碼(這里也不貼代碼了,各位讀者需要閱讀的請移步到項目當中),之后發布上傳我們的網站到Linux中,重啟Jexus,得到我們想要的效果:

在這里,我需要提醒一下各位讀者:因為PostgreSQL中默認是小寫的,即在Linux的PostgreSQL控制台中,如果讀者們對字段沒有使用雙引號修飾,無論讀者們使用大寫還是小寫,PostgreSQL都會自動的把字母轉換為小寫。而在這里,我們的實體類Person中屬性的命名規則是采用帕斯卡命名法(大寫開頭),如果讀者們沒有對實體類中的屬性加標簽(手動的指明該實體屬性對應數據庫中的字段名)或者在調用PetaPoco的方法時手動的指明數據庫中的對應字段名,網站運行時就有可能發生異常。因此,為了避免不必要的麻煩,並且增加代碼的可讀性,我建議各位讀者在寫實體類的時候順帶把該實體和里面的屬性進行手動的數據映射。


就這樣,我們對Linux搭建和部署.NET網站做了一個拋磚引玉,同時也證明了Linux中跑.NET的可能性與可行性,好的,我們這回合暫時就到這里結束。

下一節,我們嘗試在Mono中部署一款優秀的開源框架,也就是在已經在Java中大行其道的Spring,我們部署的是Spring.NET,嗯,我們下回見。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM