程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> 基於.NET平台的分層架構實戰(九)—數據訪問層的第三種實現:基於NBear框架

基於.NET平台的分層架構實戰(九)—數據訪問層的第三種實現:基於NBear框架

編輯:關於.NET

基於.NET平台的分層架構實戰(九)—數據訪問層的第三種實現:基於NBear框架的ORM實現

前面的文章討論了使用SQL語句和存儲過程兩種數據訪問層的實現方式,這一篇裡,將討論使用ORM方式實現數據訪問層的方法。

對象-關系映射(Object/Relation Mapping,簡稱ORM),是隨著面向對象的軟件開發方法發展而產生的。面向對象的開發方法是當今企業級應用開發環境中的主流開發方法,關系數據庫是企業級應用環境中永久存放數據的主流數據存儲系統。對象和關系數據是業務實體的兩種表現形式,業務實體在內存中表現為對象,在數據庫中表現為關系數據。內存中的對象之間存在關聯和繼承關系,而在數據庫中,關系數據無法直接表達多對多關聯和繼承關系。因此,對象-關系映射(ORM)系統一般以中間件的形式存在,主要實現程序對象到關系數據庫數據的映射。

目前.NET平台上有許多ORM框架可供選擇,如NBear、NHibernate等等。這裡我們選擇NBear實現ORM。

NBear是由博客園的Teddy's Knowledge Base團隊開發的一個開源框架,主要用來提高.NET平台的開發效率,其中包含了ORM、IoC、MVP等多個組件,這裡僅僅用到其中的ORM功能。關於NBear的詳細使用方法本文不再詳述,請參考NBear入門教程。NBear的最新版本下載地址為http://files.cnblogs.com/hjf1223/NBearV3.7.2.11_src.rar。

下面我們一步一步實現數據訪問層的ORM實現。

1.創建實體設計工程

使用NBear實現ORM功能,首先要創建一個實體設計工程,這個工程最終不會應用到系統中,但是必須通過它來生成NBear實體類以及配置文件。

首先,我們在解決方案下新建一個工程,名字為NBearEntityDesign,並為這個工程添加到文件NBear.Common.Design.dll的引用,這個文件在NBear文件包的dist目錄下。

完成後,在這個工程下新建一個C#文件,名為EntityDesign.cs,這個文件就是設計文件,根據對實體和數據庫的設計,編寫完整代碼如下:

EntityDesign.cs

1using System;
2using System.Collections.Generic;
3using System.Text;
4using NBear.Common.Design;
5
6namespace NGuestBook.NBearEntityDesign
7{
8  public interface TAdmin : Entity
9  {
10    [PrimaryKey]
11    int ID { get; }
12    [SqlType("nvarchar(20)")]
13    string Name { get; set; }
14    [SqlType("nvarchar(50)")]
15    string Password { get; set; }
16  }
17
18  public interface TComment : Entity
19  {
20    [PrimaryKey]
21    int ID { get; }
22    [SqlType("ntext")]
23    string Content { get; set; }
24    DateTime Time { get; set; }
25    int MessageID { get; set; }
26  }
27
28  public interface TMessage : Entity
29  {
30    [PrimaryKey]
31    int ID { get; }
32    [SqlType("nvarchar(20)")]
33    string GuestName { get; set; }
34    [SqlType("nvarchar(100)")]
35    string GuestEmail { get; set; }
36    [SqlType("ntext")]
37    string Content { get; set; }
38    DateTime Time { get; set; }
39    [SqlType("ntext")]
40    string Reply { get; set; }
41    [SqlType("nvarchar(10)")]
42    string IsPass { get; set; }
43  }
44}

設計完後,將這個工程編譯備用。

2.創建NBear專用實體類及配置文件

在NBear文件包的dist目錄下,有一個NBear.Tools.EntityDesignToEntity.exe程序,打開它,點擊“Browse”按鈕,選擇剛才編譯生成的NGuestBook.NBearEntityDesign.dll文件,並在Output Namespace文本框裡輸入相應的命名空間,這裡我們應輸入“NGuestBook.NBearDAL”。然後點擊“Generate Entities”按鈕,這時會在底下的文本框裡生成NBear專用實體類代碼。

在解決方案下新建一個工程NBearDAL,用於存放所有ORM數據訪問層的實現代碼。在這個工程下新建Entities.cs,將剛才自動生成的代碼覆蓋掉這個文件的代碼,專用實體類就做好了。

另外,需要給工程NBearDAL添加到NBear.Common.dll和NBear.Data.dll的引用,這兩個文件都在dist目錄下。

點擊“Generate Configuration”按鈕,這時會生成配置代碼。在Web工程下新建文件NBearConfig.xml,將生成的代碼復制到這個文件裡保存。

最後還要修改一下Web.config文件。增加如下配置代碼:

   <configSections>
    <section name="entityConfig" type="NBear.Common.EntityConfigurationSection, NBear.Common"/>
   </configSections>
   <entityConfig>
    <includes>
     <add key="Sample Entity Config" value="~/NBearConfig.xml"/>
    </includes>
   </entityConfig>

然後再在<connectionStrings>節點下增加如下項:

<add name="NBearConnectionString" connectionString="Server=LOCALHOST\SQLEXPRESS;Database=NGuestBook;Uid=WebUser;Pwd=123456" providerName="NBear.Data.SqlServer.SqlDbProvider"/>

其中connectionString是連接字符串,根據個人不同情況進行修改。這裡使用的是SQLServer2005。

因為數據庫在上一篇中已經創建好了,這裡就不需要創建數據庫了。

3.編寫轉換器

這裡出現了一個矛盾:業務邏輯層和表示層需要使用通用的實體類,如AdminInfo,而NBear需要使用專用實體類。怎麼解決這個矛盾呢?我這裡使用的方法是一個我稱之為“轉換器”的方法。 即為沒一個實體寫一個專門的轉換器,實現兩種實體類的轉換。這裡以管理員實體為例,這個轉換器寫在NBearDAL工程下的AdminConvertor.cs文件中。具體代碼如下:

AdminConvertor

1using System;
2using NGuestBook.Entity;
3
4namespace NGuestBook.NBearDAL
5{
6  /**//// <summary>
7  /// 實體類轉換器-管理員
8  /// </summary>
9  public sealed class AdminConvertor
10  {
11    /**//// <summary>
12    /// 由普通管理員實體類轉化為NBear專用管理員實體類
13    /// </summary>
14    /// <param name="commonEntity">普通實體類</param>
15    /// <returns>NBear專用實體類</returns>
16    public static TAdmin CommonEntityToNBearEntity(AdminInfo commonEntity)
17    {
18      TAdmin nbaerEntity = new TAdmin();
19      nbaerEntity.ID = commonEntity.ID;
20      nbaerEntity.Name = commonEntity.Name;
21      nbaerEntity.Password = commonEntity.Password;
22
23      return nbaerEntity;
24    }
25
26    /**//// <summary>
27    /// 由NBear專用管理員實體類轉化為普通管理員實體類
28    /// </summary>
29    /// <param name="nbearEntity">NBear專用實體類</param>
30    /// <returns>普通實體類</returns>
31    public static AdminInfo NBearEntityToCommonEntity(TAdmin nbearEntity)
32    {
33      AdminInfo commonEntity = new AdminInfo();
34      commonEntity.ID = nbearEntity.ID;
35      commonEntity.Name = nbearEntity.Name;
36      commonEntity.Password = nbearEntity.Password;
37
38      return commonEntity;
39    }
40  }
41}

4.實現數據訪問層

做完上述工作,我們就可以來實現數據訪問層了。借助於NBear框架的支持,我們可以非常方便的使用ORM方式訪問數據庫。關於NBear的細節,這裡不再贅述,以管理員為例,具體代碼如下:

AdminDAL.cs

 1using System;
 2using System.Collections.Generic;
 3using System.Text;
 4using System.Data.Common;
 5using NGuestBook.IDAL;
 6using NGuestBook.Entity;
 7using NBear.Common;
 8using NBear.Data;
 9
10namespace NGuestBook.NBearDAL
11{
12  public class AdminDAL : IAdminDAL
13  {
14    /**//// <summary>
15    /// 插入管理員
16    /// </summary>
17    /// <param name="admin">管理員實體類</param>
18    /// <returns>是否成功</returns>
19    public bool Insert(AdminInfo admin)
20    {
21      Gateway.SetDefaultDatabase("NBearConnectionString");
22      DbTransaction transcation = Gateway.Default.BeginTransaction();
23      try
24      {
25        Gateway.Default.Save<TAdmin>(AdminConvertor.CommonEntityToNBearEntity(admin));
26        transcation.Commit();
27        return true;
28      }
29      catch
30      {
31        transcation.Rollback();
32        return false;
33      }
34      finally
35      {
36        Gateway.Default.CloseTransaction(transcation);
37      }
38    }
39
40    /**//// <summary>
41    /// 刪除管理員
42    /// </summary>
43    /// <param name="id">欲刪除的管理員的ID</param>
44    /// <returns>是否成功</returns>
45    public bool Delete(int id)
46    {
47      Gateway.SetDefaultDatabase("NBearConnectionString");
48      DbTransaction transcation = Gateway.Default.BeginTransaction();
49      try
50      {
51        Gateway.Default.Delete<TAdmin>(id);
52        transcation.Commit();
53        return true;
54      }
55      catch
56      {
57        transcation.Rollback();
58        return false;
59      }
60      finally
61      {
62        Gateway.Default.CloseTransaction(transcation);
63      }
64    }
65
66    /**//// <summary>
67    /// 更新管理員信息
68    /// </summary>
69    /// <param name="admin">管理員實體類</param>
70    /// <returns>是否成功</returns>
71    public bool Update(AdminInfo admin)
72    {
73      Gateway.SetDefaultDatabase("NBearConnectionString");
74      DbTransaction transcation = Gateway.Default.BeginTransaction();
75      PropertyItem[] properties = {
76        new PropertyItem("Name"),
77        new PropertyItem("Password")
78      };
79      object[] values ={
80        admin.Name,
81        admin.Password
82      };
83      try
84      {
85        Gateway.Default.Update<TAdmin>(properties, values, null, transcation);
86        transcation.Commit();
87        return true;
88      }
89      catch
90      {
91        transcation.Rollback();
92        return false;
93      }
94      finally
95      {
96        Gateway.Default.CloseTransaction(transcation);
97      }
98    }
99
100    /**//// <summary>
101    /// 按ID取得管理員信息
102    /// </summary>
103    /// <param name="id">管理員ID</param>
104    /// <returns>管理員實體類</returns>
105    public AdminInfo GetByID(int id)
106    {
107      Gateway.SetDefaultDatabase("NBearConnectionString");
108      TAdmin tAdmin = Gateway.Default.Find<TAdmin>(TAdmin._.ID == id);
109      return tAdmin == null ? null : AdminConvertor.NBearEntityToCommonEntity(tAdmin);
110    }
111
112    /**//// <summary>
113    /// 按用戶名及密碼取得管理員信息
114    /// </summary>
115    /// <param name="name">用戶名</param>
116    /// <param name="password">密碼</param>
117    /// <returns>管理員實體類,不存在時返回null</returns>
118    public AdminInfo GetByNameAndPassword(string name, string password)
119    {
120      Gateway.SetDefaultDatabase("NBearConnectionString");
121      TAdmin tAdmin = Gateway.Default.Find<TAdmin>(TAdmin._.Name == name && TAdmin._.Password == password);
122      return tAdmin == null ? null : AdminConvertor.NBearEntityToCommonEntity(tAdmin);
123    }
124
125    /**//// <summary>
126    /// 按管理員名取得管理員信息
127    /// </summary>
128    /// <param name="name">管理員名</param>
129    /// <returns>管理員實體類</returns>
130    public AdminInfo GetByName(string name)
131    {
132      Gateway.SetDefaultDatabase("NBearConnectionString");
133      TAdmin tAdmin = Gateway.Default.Find<TAdmin>(TAdmin._.Name == name);
134      return tAdmin == null ? null : AdminConvertor.NBearEntityToCommonEntity(tAdmin);
135    }
136
137    /**//// <summary>
138    /// 取得全部管理員信息
139    /// </summary>
140    /// <returns>管理員實體類集合</returns>
141    public IList<AdminInfo> GetAll()
142    {
143      IList<AdminInfo> adminCollection = new List<AdminInfo>();
144      Gateway.SetDefaultDatabase("NBearConnectionString");
145      TAdmin[] tAdminCollection = Gateway.Default.FindArray<TAdmin>(null, TAdmin._.ID.Desc);
146      foreach (TAdmin tAdmin in tAdminCollection)
147      {
148        adminCollection.Add(AdminConvertor.NBearEntityToCommonEntity(tAdmin));
149      }
150      return adminCollection;
151    }
152  }
153}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved