NetTier模板生成的代码框架用法 (转)
生活随笔
收集整理的這篇文章主要介紹了
NetTier模板生成的代码框架用法 (转)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.1. 概述:
使用NetTier模板生成的.net代碼,包括完整的數據層,使用的技術是微軟的
EnterpriseLibrary1.1版本,對應每張表都生成相對應的增刪改查函數和存儲過程,在查詢中支
持多字段查詢和翻頁。數據層為工廠模型,只要調用DataRepository 類即可獲取相應表的接
口實例,然后可以對改表進行操作了。對于多表關聯操作,在父表中可以獲取子集的查詢記
錄,保存在IList 容器里面,對于子表,提供父表的對象實例。對于數據庫的操作提供事務功
能。對于更加復雜的操作,直接提供EnterpriseLibrary的數據庫操作實例,直接進行操作。
特征:
1、 生成vs.net工程和解決方案;
2、 集成EnterpriseLibrary1.1版本,對于數據庫鏈接可以直接使用EnterpriseLibrary的配置文
件;
3、 數據表和實體的映射關系是1:1的,每張表都有一個實體生成,在實體里面對應了每個
字段,實體類是序列化的,有trigger事件,支持枚舉類型的字段;
4、 對于表和視圖生成的實體的操作包括:基本的CRUD操作:UPDATE, DELETE, INSERT,
SELECT ALL, PAGED SELECT, FIND;支持主鍵、外鍵、多表關聯、排序、分頁、sql
語句、視圖查詢;
5、 獲取強類型的數據集存儲在Ilist或者Vlist里面,可以綁定到DataGrid、GridView或
者其他的頁面控件中,支持表格排序;
6、 生成webservice 服務進行數據分發;
7、 創建存儲過程腳本,而且自動安裝到數據庫服務器上面;
8、 生成nant的完整的build.xml 文件,可以自動編譯、測試代碼,生成chm 格式的api
文檔;
9、 根據數據庫生成完整的數據驗證規則,包括一個管理規則的框架;
10、 每個表都有一個實體類,你可以在你的客戶代碼里面繼承,然后增加自己的處理方
法;
11、 生成數據源可以讓你你無需再去處理數據源的問題了;
12、 創建全套的web admin用戶控件,你可以對數據庫進行web管理;
13、 完整的nunit測試;
14、 完整的注釋,符合微軟的命名規則;
15、 nettiers 模板是免費開源的。
1.2. 框架結構:
數據邏輯包括客戶業務邏輯組件、數據接口邏輯組件(持久層邏輯),整個設計建筑在el
上面。
下面以northwind數據庫的單表employee為例進行講解。
Employee數據表結構:
生成的OO 結構:
接口統一的調用DataRepository 獲取各功能塊的provider,然后進行單表的增刪改查操
作,如果需要更加復雜的業務邏輯,比如要用到事務來同時處理幾個表,那么需要另外寫業務
邏輯代碼了,這些邏輯層代碼可以放在bl 層里面。值得一提的是,現在在bl 層里面生成的代
碼,只有最基本和通用的業務邏輯,只生成了單表數據的實體類VO、單表數據各字段的處理
和數據集合的排序、檢索等處理。
EmployeesCollection
EmployeesCollectionBase
Employees
EmployeesBase EmployeesVO
在DataRepository 里面獲取各功能模塊的provider的方法是static 方法,得到的是各
個sqlprovider 的實例,而提供給外界使用的是其對應的抽象類定義的方法。
實例的調用順序是:
:
DataRepository
:
SqlDataProvider
:
SqlEmployeesProviderBase
1: EmployeesProvider
2: GetAll
3: GetByEmployeeID
分析DataRepository.EmployeesProvider.GetAll()的操作:實例化的順序是
DataRespository 類里面維護了一個全局的變量Current,這個Current實際上是
SqlDataProvider 的實例,而Current是DataProviderBase 類型,關系為:
DataProviderBase
SqlDataProvider
(from sqlclient)
在DataRepository 中獲取EmployeesProvider的時候,實際上是調用了
SqlDataProvider 里面的方法EmployeesProvider(),new 了一個SqlEmployeesProvider 實
例,而這個實例中所有的方法的實現在SqlEmployeesProviderBase類中實現的,因為
SqlEmployeesProvider繼承了SqlEmployeesProviderBase類,這個類相當于是dao 層,直接進行
數據庫操作。
SqlEmployeesProviderBase
EmployeesProviderBase
(from base)
SqlEmployeesProvider
在生成各個sqlprovider 實例的時候,需要先實例化SqlDataProvider,這個用的是
Activator 類根據配置文件提供的這個類的名字生成的,nettier為了做到對不同數據庫的支
持,提供了一個配置文件nettiersconfigdata.config 和讀取這個配置文件的dll:
NetTiers.Configuration.dll。
Activator 類可以動態構造對象,有點像Java里面的
Class.forName(ClassName).newInstance()語句,因為用Activator 類構造對象,其類名在
編譯時可以不確定,所以可以用來做插件的接口,做出Winamp 那種可以外加DLL 插件的程序
來。
1.3. 調用接口的方法:
1.3.1. 獲取所有數據
獲取所有的Employee數據,按照LastName字段進行排序:
using Northwind.DataAccessLayer;
// Get all the employee, sort it on the LastName and print them out
TList<Employees> employees = DataRepository.EmployeeProvider.GetAll();
employees.Sort(EmployeeColumns.LastName, ListSortDirection.Ascending);
foreach(Employee employee in employees)
{
Console.WriteLine("{1} {0}", employee.FirstName, employee.LastName);
}
1.3.2. 新增數據
創建一個新的employee 并且保存
using Northwind.DataAccessLayer;
// Create a new record and save
Employee employee = new Employee();
employee.FirstName = "John";employee.LastName = "Doe";
employee.BirthDate = DateTime.Now;employee.Address = "10 , fake street";
employee.City = "Metroplolis";employee.Country = "USA";
employee.HireDate = DateTime.Now;
employee.HomePhone = "0123456789";
employee.Notes = "This is a fake employee";
employee.Title = "M";
employee.TitleOfCourtesy = "Dear";
employee.PostalCode = "5556";
employee.Region = "New-York";
DataRepository.EmployeeProvider.Insert(employee);
//look, new id already populated
Console.WriteLine("New Employee ID" + employee.EmployeeId);
1.3.3. 修改數據
按照下標獲取數據并且修改數據;
using Northwind.DataAccessLayer;
// Select by Index and Update
TList<Employees> employees =
DataRepository.EmployeeProvider.GetByLastName("Doe");
if (employees.Count == 1)
{
employees[0].Notes = "This is a modified fake employee";
DataRepository.EmployeeProvider.Save(employees[0]);
Console.Write(employees[0]);
}
1.3.4. 刪除數據
通過主鍵查詢數據并且刪除
using Northwind.DataAccessLayer;
// Select by primary key and Delete
// (Demonstrate that insert, update, delete methods can also take collection
as parameter)
Employee employee = SqlDataRepository.EmployeeProvider.GetByEmployeeID(13);
DataRepository.EmployeeProvider.Delete(employees);
1.3.5. 事務控制
事務控制實例,可以用事務控制插入、修改、刪除的操作,保證全部成功或者失敗回滾;
using Northwind.DataAccessLayer;
// The SqlClient can work with transactions.
// Also show the Save method, wich encapsulate the use of Insert, Update and
Delete methods.
TransactionManager transaction = DataRepository.CreateTransaction();
transaction.BeginTransaction(/*IsolationLevel.ReadUncommited*/);
try
{
// Insert
Employee employee = new Employee();
employee.FirstName = "John";
employee.LastName = "Doe";
employee.BirthDate = DateTime.Now;
employee.Address = "10 , fake street";
employee.City = "Metroplolis";
employee.Country = "USA";
employee.HireDate = DateTime.Now;
employee.HomePhone = "0123456789";
mployee.Notes = "This is a fake employee";
employee.Title = "M";
employee.TitleOfCourtesy = "Doctor";
employee.PostalCode = "5556";
employee.Region = "New-York";
DataRepository.EmployeeProvider.Save(transaction, employee);
// modify the employee instance
employee.Notes = "This is a modified fake employee";
// Update
DataRepository.EmployeeProvider.Save(transaction, employee);
transaction.Commit();
Console.WriteLine("ok");
}
catch(Exception ex)
{
try { transaction.Rollback();} catch(){}
Console.WriteLine("nok : {0}", ex);
}
1.3.6. 關聯保存
深度保存,可以同時保存父對象和子集
/*
DeepSave helper method can help you to save an object and its children in
one call.
*/
using Northwind.DataAccessLayer;
Order order = Order.CreateOrder("ALFKI", 1, DateTime.Now, DateTime.Now,
DateTime.Now, 1, 0.1m, "ship name", "ship address" , "paris", "idf", "75000",
"france");
order.OrderDetailCollection.Add(order.OrderID, 1, 15.6m, 10, 0.02f);
order.OrderDetailCollection.Add(order.OrderID, 2, 122.6m, 43, 0.03f);
DataRepository.OrderProvider.DeepSave(order);
Console.WriteLine("new order saved: orderId is: " + order.OrderID.ToString());
1.3.7. 多數據庫支持
同時支持多個不同的數據庫進行操作,在el 配置文件中配置不同的數據庫連接或者在代
碼中動態生成不同的數據庫連接,達到同時使用不同類型數據庫的目的。
/*
You can configure multiple data provider in the configuration console, and
write code to acces a specific one, instead of the default.
*/
using Northwind.DataAccessLayer;
SqlDataProvider myRepository = DataRepository.Providers["my second data
provider"] as Northwind.DataAccessLayer.SqlClient.SqlDataProvider;
this.listBox1.DataSource = myRepository.ProductProvider.GetAll();
this.listBox1.DisplayMember = "ProductName";
this.listBox1.ValueMember = "ProductID";
//Or if you can't have it pre-configured, you can change the connection
string at runtime.
using Northwind.DataAccessLayer;
//New syntax using a declared connection string:
TList<Products> list =
DataRepository.Connections["NorthwindConnectionString2"].Provider.CustomersProvide
r.GetAll();
//New syntax using a dynamic connection string:
DataRepository.AddConnection("DynamicConnectionString", "Data
Source=(local);Initial Catalog=Northwind;Integrated Security=true;");
TList<Products< list =
DataRepository.Connections["DynamicConnectionString"].Provider.ProductsProvider.Ge
tAll();
this.listBox1.DataSource = list;
this.listBox1.DisplayMember = "ProductName";
this.listBox1.ValueMember = "ProductID";
1.4. 配置nettiers模板
1.4.1. Datasource目錄:
SourceDatabase 數據庫名字和連接參數,在codesmith explore中有配置界面彈出
SourceTables 在數據表里面需要實體化的表
EntireDatabase 明確在數據庫中需要實體化的表,這個設置將取代SourceTables 的設置
1.4.2. General 目錄
OuputDirectory 輸出目錄,在codesmith explore里面有配置界面彈出
BusinessLogicLayerFolderName 邏輯層子目錄名,推薦置空
DataAccessLayerFolderName 數據層子目錄名,推薦值:DataAccessLayer
SqlFolderName 存儲過程腳本目錄名,推薦:SQL
NameSpace 項目的命名空間,名稱和目錄同。
GenerateUnitTest 聲明生成nunit測試項目名
VsNetIntegration 聲明是整個的生成一個工程還是按層分開生成工程
VsNetVersion Vs.net的版本
1.4.3. Webservice參數
GenerateWebService 聲明是否生成webservice服務
WebServiceOutputPath Webservice的生成文件路徑
WebServiceUrl 數據層子目錄名,推薦值:DataAccessLayer
SqlFolderName 指向WebServiceOutputPath 的url
配置完成后可以保存為配置文件,下次只需要載入即可。
新增了web層的模板,叫weblayer,實現單表的增刪改查;
給一個配置好的例子,對sqlserver2000的數據庫northwind的配置例子,見netier目錄下面
property.xml文件,可以直接載入然后生成對應的代碼,生成的是完整的工程,可以直接編譯
運行。??
1.1. 概述:
使用NetTier模板生成的.net代碼,包括完整的數據層,使用的技術是微軟的
EnterpriseLibrary1.1版本,對應每張表都生成相對應的增刪改查函數和存儲過程,在查詢中支
持多字段查詢和翻頁。數據層為工廠模型,只要調用DataRepository 類即可獲取相應表的接
口實例,然后可以對改表進行操作了。對于多表關聯操作,在父表中可以獲取子集的查詢記
錄,保存在IList 容器里面,對于子表,提供父表的對象實例。對于數據庫的操作提供事務功
能。對于更加復雜的操作,直接提供EnterpriseLibrary的數據庫操作實例,直接進行操作。
特征:
1、 生成vs.net工程和解決方案;
2、 集成EnterpriseLibrary1.1版本,對于數據庫鏈接可以直接使用EnterpriseLibrary的配置文
件;
3、 數據表和實體的映射關系是1:1的,每張表都有一個實體生成,在實體里面對應了每個
字段,實體類是序列化的,有trigger事件,支持枚舉類型的字段;
4、 對于表和視圖生成的實體的操作包括:基本的CRUD操作:UPDATE, DELETE, INSERT,
SELECT ALL, PAGED SELECT, FIND;支持主鍵、外鍵、多表關聯、排序、分頁、sql
語句、視圖查詢;
5、 獲取強類型的數據集存儲在Ilist或者Vlist里面,可以綁定到DataGrid、GridView或
者其他的頁面控件中,支持表格排序;
6、 生成webservice 服務進行數據分發;
7、 創建存儲過程腳本,而且自動安裝到數據庫服務器上面;
8、 生成nant的完整的build.xml 文件,可以自動編譯、測試代碼,生成chm 格式的api
文檔;
9、 根據數據庫生成完整的數據驗證規則,包括一個管理規則的框架;
10、 每個表都有一個實體類,你可以在你的客戶代碼里面繼承,然后增加自己的處理方
法;
11、 生成數據源可以讓你你無需再去處理數據源的問題了;
12、 創建全套的web admin用戶控件,你可以對數據庫進行web管理;
13、 完整的nunit測試;
14、 完整的注釋,符合微軟的命名規則;
15、 nettiers 模板是免費開源的。
1.2. 框架結構:
數據邏輯包括客戶業務邏輯組件、數據接口邏輯組件(持久層邏輯),整個設計建筑在el
上面。
下面以northwind數據庫的單表employee為例進行講解。
Employee數據表結構:
生成的OO 結構:
接口統一的調用DataRepository 獲取各功能塊的provider,然后進行單表的增刪改查操
作,如果需要更加復雜的業務邏輯,比如要用到事務來同時處理幾個表,那么需要另外寫業務
邏輯代碼了,這些邏輯層代碼可以放在bl 層里面。值得一提的是,現在在bl 層里面生成的代
碼,只有最基本和通用的業務邏輯,只生成了單表數據的實體類VO、單表數據各字段的處理
和數據集合的排序、檢索等處理。
EmployeesCollection
EmployeesCollectionBase
Employees
EmployeesBase EmployeesVO
在DataRepository 里面獲取各功能模塊的provider的方法是static 方法,得到的是各
個sqlprovider 的實例,而提供給外界使用的是其對應的抽象類定義的方法。
實例的調用順序是:
:
DataRepository
:
SqlDataProvider
:
SqlEmployeesProviderBase
1: EmployeesProvider
2: GetAll
3: GetByEmployeeID
分析DataRepository.EmployeesProvider.GetAll()的操作:實例化的順序是
DataRespository 類里面維護了一個全局的變量Current,這個Current實際上是
SqlDataProvider 的實例,而Current是DataProviderBase 類型,關系為:
DataProviderBase
SqlDataProvider
(from sqlclient)
在DataRepository 中獲取EmployeesProvider的時候,實際上是調用了
SqlDataProvider 里面的方法EmployeesProvider(),new 了一個SqlEmployeesProvider 實
例,而這個實例中所有的方法的實現在SqlEmployeesProviderBase類中實現的,因為
SqlEmployeesProvider繼承了SqlEmployeesProviderBase類,這個類相當于是dao 層,直接進行
數據庫操作。
SqlEmployeesProviderBase
EmployeesProviderBase
(from base)
SqlEmployeesProvider
在生成各個sqlprovider 實例的時候,需要先實例化SqlDataProvider,這個用的是
Activator 類根據配置文件提供的這個類的名字生成的,nettier為了做到對不同數據庫的支
持,提供了一個配置文件nettiersconfigdata.config 和讀取這個配置文件的dll:
NetTiers.Configuration.dll。
Activator 類可以動態構造對象,有點像Java里面的
Class.forName(ClassName).newInstance()語句,因為用Activator 類構造對象,其類名在
編譯時可以不確定,所以可以用來做插件的接口,做出Winamp 那種可以外加DLL 插件的程序
來。
1.3. 調用接口的方法:
1.3.1. 獲取所有數據
獲取所有的Employee數據,按照LastName字段進行排序:
using Northwind.DataAccessLayer;
// Get all the employee, sort it on the LastName and print them out
TList<Employees> employees = DataRepository.EmployeeProvider.GetAll();
employees.Sort(EmployeeColumns.LastName, ListSortDirection.Ascending);
foreach(Employee employee in employees)
{
Console.WriteLine("{1} {0}", employee.FirstName, employee.LastName);
}
1.3.2. 新增數據
創建一個新的employee 并且保存
using Northwind.DataAccessLayer;
// Create a new record and save
Employee employee = new Employee();
employee.FirstName = "John";employee.LastName = "Doe";
employee.BirthDate = DateTime.Now;employee.Address = "10 , fake street";
employee.City = "Metroplolis";employee.Country = "USA";
employee.HireDate = DateTime.Now;
employee.HomePhone = "0123456789";
employee.Notes = "This is a fake employee";
employee.Title = "M";
employee.TitleOfCourtesy = "Dear";
employee.PostalCode = "5556";
employee.Region = "New-York";
DataRepository.EmployeeProvider.Insert(employee);
//look, new id already populated
Console.WriteLine("New Employee ID" + employee.EmployeeId);
1.3.3. 修改數據
按照下標獲取數據并且修改數據;
using Northwind.DataAccessLayer;
// Select by Index and Update
TList<Employees> employees =
DataRepository.EmployeeProvider.GetByLastName("Doe");
if (employees.Count == 1)
{
employees[0].Notes = "This is a modified fake employee";
DataRepository.EmployeeProvider.Save(employees[0]);
Console.Write(employees[0]);
}
1.3.4. 刪除數據
通過主鍵查詢數據并且刪除
using Northwind.DataAccessLayer;
// Select by primary key and Delete
// (Demonstrate that insert, update, delete methods can also take collection
as parameter)
Employee employee = SqlDataRepository.EmployeeProvider.GetByEmployeeID(13);
DataRepository.EmployeeProvider.Delete(employees);
1.3.5. 事務控制
事務控制實例,可以用事務控制插入、修改、刪除的操作,保證全部成功或者失敗回滾;
using Northwind.DataAccessLayer;
// The SqlClient can work with transactions.
// Also show the Save method, wich encapsulate the use of Insert, Update and
Delete methods.
TransactionManager transaction = DataRepository.CreateTransaction();
transaction.BeginTransaction(/*IsolationLevel.ReadUncommited*/);
try
{
// Insert
Employee employee = new Employee();
employee.FirstName = "John";
employee.LastName = "Doe";
employee.BirthDate = DateTime.Now;
employee.Address = "10 , fake street";
employee.City = "Metroplolis";
employee.Country = "USA";
employee.HireDate = DateTime.Now;
employee.HomePhone = "0123456789";
mployee.Notes = "This is a fake employee";
employee.Title = "M";
employee.TitleOfCourtesy = "Doctor";
employee.PostalCode = "5556";
employee.Region = "New-York";
DataRepository.EmployeeProvider.Save(transaction, employee);
// modify the employee instance
employee.Notes = "This is a modified fake employee";
// Update
DataRepository.EmployeeProvider.Save(transaction, employee);
transaction.Commit();
Console.WriteLine("ok");
}
catch(Exception ex)
{
try { transaction.Rollback();} catch(){}
Console.WriteLine("nok : {0}", ex);
}
1.3.6. 關聯保存
深度保存,可以同時保存父對象和子集
/*
DeepSave helper method can help you to save an object and its children in
one call.
*/
using Northwind.DataAccessLayer;
Order order = Order.CreateOrder("ALFKI", 1, DateTime.Now, DateTime.Now,
DateTime.Now, 1, 0.1m, "ship name", "ship address" , "paris", "idf", "75000",
"france");
order.OrderDetailCollection.Add(order.OrderID, 1, 15.6m, 10, 0.02f);
order.OrderDetailCollection.Add(order.OrderID, 2, 122.6m, 43, 0.03f);
DataRepository.OrderProvider.DeepSave(order);
Console.WriteLine("new order saved: orderId is: " + order.OrderID.ToString());
1.3.7. 多數據庫支持
同時支持多個不同的數據庫進行操作,在el 配置文件中配置不同的數據庫連接或者在代
碼中動態生成不同的數據庫連接,達到同時使用不同類型數據庫的目的。
/*
You can configure multiple data provider in the configuration console, and
write code to acces a specific one, instead of the default.
*/
using Northwind.DataAccessLayer;
SqlDataProvider myRepository = DataRepository.Providers["my second data
provider"] as Northwind.DataAccessLayer.SqlClient.SqlDataProvider;
this.listBox1.DataSource = myRepository.ProductProvider.GetAll();
this.listBox1.DisplayMember = "ProductName";
this.listBox1.ValueMember = "ProductID";
//Or if you can't have it pre-configured, you can change the connection
string at runtime.
using Northwind.DataAccessLayer;
//New syntax using a declared connection string:
TList<Products> list =
DataRepository.Connections["NorthwindConnectionString2"].Provider.CustomersProvide
r.GetAll();
//New syntax using a dynamic connection string:
DataRepository.AddConnection("DynamicConnectionString", "Data
Source=(local);Initial Catalog=Northwind;Integrated Security=true;");
TList<Products< list =
DataRepository.Connections["DynamicConnectionString"].Provider.ProductsProvider.Ge
tAll();
this.listBox1.DataSource = list;
this.listBox1.DisplayMember = "ProductName";
this.listBox1.ValueMember = "ProductID";
1.4. 配置nettiers模板
1.4.1. Datasource目錄:
SourceDatabase 數據庫名字和連接參數,在codesmith explore中有配置界面彈出
SourceTables 在數據表里面需要實體化的表
EntireDatabase 明確在數據庫中需要實體化的表,這個設置將取代SourceTables 的設置
1.4.2. General 目錄
OuputDirectory 輸出目錄,在codesmith explore里面有配置界面彈出
BusinessLogicLayerFolderName 邏輯層子目錄名,推薦置空
DataAccessLayerFolderName 數據層子目錄名,推薦值:DataAccessLayer
SqlFolderName 存儲過程腳本目錄名,推薦:SQL
NameSpace 項目的命名空間,名稱和目錄同。
GenerateUnitTest 聲明生成nunit測試項目名
VsNetIntegration 聲明是整個的生成一個工程還是按層分開生成工程
VsNetVersion Vs.net的版本
1.4.3. Webservice參數
GenerateWebService 聲明是否生成webservice服務
WebServiceOutputPath Webservice的生成文件路徑
WebServiceUrl 數據層子目錄名,推薦值:DataAccessLayer
SqlFolderName 指向WebServiceOutputPath 的url
配置完成后可以保存為配置文件,下次只需要載入即可。
新增了web層的模板,叫weblayer,實現單表的增刪改查;
給一個配置好的例子,對sqlserver2000的數據庫northwind的配置例子,見netier目錄下面
property.xml文件,可以直接載入然后生成對應的代碼,生成的是完整的工程,可以直接編譯
運行。??
使用NetTier模板生成的.net代碼,包括完整的數據層,使用的技術是微軟的
EnterpriseLibrary1.1版本,對應每張表都生成相對應的增刪改查函數和存儲過程,在查詢中支
持多字段查詢和翻頁。數據層為工廠模型,只要調用DataRepository 類即可獲取相應表的接
口實例,然后可以對改表進行操作了。對于多表關聯操作,在父表中可以獲取子集的查詢記
錄,保存在IList 容器里面,對于子表,提供父表的對象實例。對于數據庫的操作提供事務功
能。對于更加復雜的操作,直接提供EnterpriseLibrary的數據庫操作實例,直接進行操作。
特征:
1、 生成vs.net工程和解決方案;
2、 集成EnterpriseLibrary1.1版本,對于數據庫鏈接可以直接使用EnterpriseLibrary的配置文
件;
3、 數據表和實體的映射關系是1:1的,每張表都有一個實體生成,在實體里面對應了每個
字段,實體類是序列化的,有trigger事件,支持枚舉類型的字段;
4、 對于表和視圖生成的實體的操作包括:基本的CRUD操作:UPDATE, DELETE, INSERT,
SELECT ALL, PAGED SELECT, FIND;支持主鍵、外鍵、多表關聯、排序、分頁、sql
語句、視圖查詢;
5、 獲取強類型的數據集存儲在Ilist或者Vlist里面,可以綁定到DataGrid、GridView或
者其他的頁面控件中,支持表格排序;
6、 生成webservice 服務進行數據分發;
7、 創建存儲過程腳本,而且自動安裝到數據庫服務器上面;
8、 生成nant的完整的build.xml 文件,可以自動編譯、測試代碼,生成chm 格式的api
文檔;
9、 根據數據庫生成完整的數據驗證規則,包括一個管理規則的框架;
10、 每個表都有一個實體類,你可以在你的客戶代碼里面繼承,然后增加自己的處理方
法;
11、 生成數據源可以讓你你無需再去處理數據源的問題了;
12、 創建全套的web admin用戶控件,你可以對數據庫進行web管理;
13、 完整的nunit測試;
14、 完整的注釋,符合微軟的命名規則;
15、 nettiers 模板是免費開源的。
1.2. 框架結構:
數據邏輯包括客戶業務邏輯組件、數據接口邏輯組件(持久層邏輯),整個設計建筑在el
上面。
下面以northwind數據庫的單表employee為例進行講解。
Employee數據表結構:
生成的OO 結構:
接口統一的調用DataRepository 獲取各功能塊的provider,然后進行單表的增刪改查操
作,如果需要更加復雜的業務邏輯,比如要用到事務來同時處理幾個表,那么需要另外寫業務
邏輯代碼了,這些邏輯層代碼可以放在bl 層里面。值得一提的是,現在在bl 層里面生成的代
碼,只有最基本和通用的業務邏輯,只生成了單表數據的實體類VO、單表數據各字段的處理
和數據集合的排序、檢索等處理。
EmployeesCollection
EmployeesCollectionBase
Employees
EmployeesBase EmployeesVO
在DataRepository 里面獲取各功能模塊的provider的方法是static 方法,得到的是各
個sqlprovider 的實例,而提供給外界使用的是其對應的抽象類定義的方法。
實例的調用順序是:
:
DataRepository
:
SqlDataProvider
:
SqlEmployeesProviderBase
1: EmployeesProvider
2: GetAll
3: GetByEmployeeID
分析DataRepository.EmployeesProvider.GetAll()的操作:實例化的順序是
DataRespository 類里面維護了一個全局的變量Current,這個Current實際上是
SqlDataProvider 的實例,而Current是DataProviderBase 類型,關系為:
DataProviderBase
SqlDataProvider
(from sqlclient)
在DataRepository 中獲取EmployeesProvider的時候,實際上是調用了
SqlDataProvider 里面的方法EmployeesProvider(),new 了一個SqlEmployeesProvider 實
例,而這個實例中所有的方法的實現在SqlEmployeesProviderBase類中實現的,因為
SqlEmployeesProvider繼承了SqlEmployeesProviderBase類,這個類相當于是dao 層,直接進行
數據庫操作。
SqlEmployeesProviderBase
EmployeesProviderBase
(from base)
SqlEmployeesProvider
在生成各個sqlprovider 實例的時候,需要先實例化SqlDataProvider,這個用的是
Activator 類根據配置文件提供的這個類的名字生成的,nettier為了做到對不同數據庫的支
持,提供了一個配置文件nettiersconfigdata.config 和讀取這個配置文件的dll:
NetTiers.Configuration.dll。
Activator 類可以動態構造對象,有點像Java里面的
Class.forName(ClassName).newInstance()語句,因為用Activator 類構造對象,其類名在
編譯時可以不確定,所以可以用來做插件的接口,做出Winamp 那種可以外加DLL 插件的程序
來。
1.3. 調用接口的方法:
1.3.1. 獲取所有數據
獲取所有的Employee數據,按照LastName字段進行排序:
using Northwind.DataAccessLayer;
// Get all the employee, sort it on the LastName and print them out
TList<Employees> employees = DataRepository.EmployeeProvider.GetAll();
employees.Sort(EmployeeColumns.LastName, ListSortDirection.Ascending);
foreach(Employee employee in employees)
{
Console.WriteLine("{1} {0}", employee.FirstName, employee.LastName);
}
1.3.2. 新增數據
創建一個新的employee 并且保存
using Northwind.DataAccessLayer;
// Create a new record and save
Employee employee = new Employee();
employee.FirstName = "John";employee.LastName = "Doe";
employee.BirthDate = DateTime.Now;employee.Address = "10 , fake street";
employee.City = "Metroplolis";employee.Country = "USA";
employee.HireDate = DateTime.Now;
employee.HomePhone = "0123456789";
employee.Notes = "This is a fake employee";
employee.Title = "M";
employee.TitleOfCourtesy = "Dear";
employee.PostalCode = "5556";
employee.Region = "New-York";
DataRepository.EmployeeProvider.Insert(employee);
//look, new id already populated
Console.WriteLine("New Employee ID" + employee.EmployeeId);
1.3.3. 修改數據
按照下標獲取數據并且修改數據;
using Northwind.DataAccessLayer;
// Select by Index and Update
TList<Employees> employees =
DataRepository.EmployeeProvider.GetByLastName("Doe");
if (employees.Count == 1)
{
employees[0].Notes = "This is a modified fake employee";
DataRepository.EmployeeProvider.Save(employees[0]);
Console.Write(employees[0]);
}
1.3.4. 刪除數據
通過主鍵查詢數據并且刪除
using Northwind.DataAccessLayer;
// Select by primary key and Delete
// (Demonstrate that insert, update, delete methods can also take collection
as parameter)
Employee employee = SqlDataRepository.EmployeeProvider.GetByEmployeeID(13);
DataRepository.EmployeeProvider.Delete(employees);
1.3.5. 事務控制
事務控制實例,可以用事務控制插入、修改、刪除的操作,保證全部成功或者失敗回滾;
using Northwind.DataAccessLayer;
// The SqlClient can work with transactions.
// Also show the Save method, wich encapsulate the use of Insert, Update and
Delete methods.
TransactionManager transaction = DataRepository.CreateTransaction();
transaction.BeginTransaction(/*IsolationLevel.ReadUncommited*/);
try
{
// Insert
Employee employee = new Employee();
employee.FirstName = "John";
employee.LastName = "Doe";
employee.BirthDate = DateTime.Now;
employee.Address = "10 , fake street";
employee.City = "Metroplolis";
employee.Country = "USA";
employee.HireDate = DateTime.Now;
employee.HomePhone = "0123456789";
mployee.Notes = "This is a fake employee";
employee.Title = "M";
employee.TitleOfCourtesy = "Doctor";
employee.PostalCode = "5556";
employee.Region = "New-York";
DataRepository.EmployeeProvider.Save(transaction, employee);
// modify the employee instance
employee.Notes = "This is a modified fake employee";
// Update
DataRepository.EmployeeProvider.Save(transaction, employee);
transaction.Commit();
Console.WriteLine("ok");
}
catch(Exception ex)
{
try { transaction.Rollback();} catch(){}
Console.WriteLine("nok : {0}", ex);
}
1.3.6. 關聯保存
深度保存,可以同時保存父對象和子集
/*
DeepSave helper method can help you to save an object and its children in
one call.
*/
using Northwind.DataAccessLayer;
Order order = Order.CreateOrder("ALFKI", 1, DateTime.Now, DateTime.Now,
DateTime.Now, 1, 0.1m, "ship name", "ship address" , "paris", "idf", "75000",
"france");
order.OrderDetailCollection.Add(order.OrderID, 1, 15.6m, 10, 0.02f);
order.OrderDetailCollection.Add(order.OrderID, 2, 122.6m, 43, 0.03f);
DataRepository.OrderProvider.DeepSave(order);
Console.WriteLine("new order saved: orderId is: " + order.OrderID.ToString());
1.3.7. 多數據庫支持
同時支持多個不同的數據庫進行操作,在el 配置文件中配置不同的數據庫連接或者在代
碼中動態生成不同的數據庫連接,達到同時使用不同類型數據庫的目的。
/*
You can configure multiple data provider in the configuration console, and
write code to acces a specific one, instead of the default.
*/
using Northwind.DataAccessLayer;
SqlDataProvider myRepository = DataRepository.Providers["my second data
provider"] as Northwind.DataAccessLayer.SqlClient.SqlDataProvider;
this.listBox1.DataSource = myRepository.ProductProvider.GetAll();
this.listBox1.DisplayMember = "ProductName";
this.listBox1.ValueMember = "ProductID";
//Or if you can't have it pre-configured, you can change the connection
string at runtime.
using Northwind.DataAccessLayer;
//New syntax using a declared connection string:
TList<Products> list =
DataRepository.Connections["NorthwindConnectionString2"].Provider.CustomersProvide
r.GetAll();
//New syntax using a dynamic connection string:
DataRepository.AddConnection("DynamicConnectionString", "Data
Source=(local);Initial Catalog=Northwind;Integrated Security=true;");
TList<Products< list =
DataRepository.Connections["DynamicConnectionString"].Provider.ProductsProvider.Ge
tAll();
this.listBox1.DataSource = list;
this.listBox1.DisplayMember = "ProductName";
this.listBox1.ValueMember = "ProductID";
1.4. 配置nettiers模板
1.4.1. Datasource目錄:
SourceDatabase 數據庫名字和連接參數,在codesmith explore中有配置界面彈出
SourceTables 在數據表里面需要實體化的表
EntireDatabase 明確在數據庫中需要實體化的表,這個設置將取代SourceTables 的設置
1.4.2. General 目錄
OuputDirectory 輸出目錄,在codesmith explore里面有配置界面彈出
BusinessLogicLayerFolderName 邏輯層子目錄名,推薦置空
DataAccessLayerFolderName 數據層子目錄名,推薦值:DataAccessLayer
SqlFolderName 存儲過程腳本目錄名,推薦:SQL
NameSpace 項目的命名空間,名稱和目錄同。
GenerateUnitTest 聲明生成nunit測試項目名
VsNetIntegration 聲明是整個的生成一個工程還是按層分開生成工程
VsNetVersion Vs.net的版本
1.4.3. Webservice參數
GenerateWebService 聲明是否生成webservice服務
WebServiceOutputPath Webservice的生成文件路徑
WebServiceUrl 數據層子目錄名,推薦值:DataAccessLayer
SqlFolderName 指向WebServiceOutputPath 的url
配置完成后可以保存為配置文件,下次只需要載入即可。
新增了web層的模板,叫weblayer,實現單表的增刪改查;
給一個配置好的例子,對sqlserver2000的數據庫northwind的配置例子,見netier目錄下面
property.xml文件,可以直接載入然后生成對應的代碼,生成的是完整的工程,可以直接編譯
運行。??
1.1. 概述:
使用NetTier模板生成的.net代碼,包括完整的數據層,使用的技術是微軟的
EnterpriseLibrary1.1版本,對應每張表都生成相對應的增刪改查函數和存儲過程,在查詢中支
持多字段查詢和翻頁。數據層為工廠模型,只要調用DataRepository 類即可獲取相應表的接
口實例,然后可以對改表進行操作了。對于多表關聯操作,在父表中可以獲取子集的查詢記
錄,保存在IList 容器里面,對于子表,提供父表的對象實例。對于數據庫的操作提供事務功
能。對于更加復雜的操作,直接提供EnterpriseLibrary的數據庫操作實例,直接進行操作。
特征:
1、 生成vs.net工程和解決方案;
2、 集成EnterpriseLibrary1.1版本,對于數據庫鏈接可以直接使用EnterpriseLibrary的配置文
件;
3、 數據表和實體的映射關系是1:1的,每張表都有一個實體生成,在實體里面對應了每個
字段,實體類是序列化的,有trigger事件,支持枚舉類型的字段;
4、 對于表和視圖生成的實體的操作包括:基本的CRUD操作:UPDATE, DELETE, INSERT,
SELECT ALL, PAGED SELECT, FIND;支持主鍵、外鍵、多表關聯、排序、分頁、sql
語句、視圖查詢;
5、 獲取強類型的數據集存儲在Ilist或者Vlist里面,可以綁定到DataGrid、GridView或
者其他的頁面控件中,支持表格排序;
6、 生成webservice 服務進行數據分發;
7、 創建存儲過程腳本,而且自動安裝到數據庫服務器上面;
8、 生成nant的完整的build.xml 文件,可以自動編譯、測試代碼,生成chm 格式的api
文檔;
9、 根據數據庫生成完整的數據驗證規則,包括一個管理規則的框架;
10、 每個表都有一個實體類,你可以在你的客戶代碼里面繼承,然后增加自己的處理方
法;
11、 生成數據源可以讓你你無需再去處理數據源的問題了;
12、 創建全套的web admin用戶控件,你可以對數據庫進行web管理;
13、 完整的nunit測試;
14、 完整的注釋,符合微軟的命名規則;
15、 nettiers 模板是免費開源的。
1.2. 框架結構:
數據邏輯包括客戶業務邏輯組件、數據接口邏輯組件(持久層邏輯),整個設計建筑在el
上面。
下面以northwind數據庫的單表employee為例進行講解。
Employee數據表結構:
生成的OO 結構:
接口統一的調用DataRepository 獲取各功能塊的provider,然后進行單表的增刪改查操
作,如果需要更加復雜的業務邏輯,比如要用到事務來同時處理幾個表,那么需要另外寫業務
邏輯代碼了,這些邏輯層代碼可以放在bl 層里面。值得一提的是,現在在bl 層里面生成的代
碼,只有最基本和通用的業務邏輯,只生成了單表數據的實體類VO、單表數據各字段的處理
和數據集合的排序、檢索等處理。
EmployeesCollection
EmployeesCollectionBase
Employees
EmployeesBase EmployeesVO
在DataRepository 里面獲取各功能模塊的provider的方法是static 方法,得到的是各
個sqlprovider 的實例,而提供給外界使用的是其對應的抽象類定義的方法。
實例的調用順序是:
:
DataRepository
:
SqlDataProvider
:
SqlEmployeesProviderBase
1: EmployeesProvider
2: GetAll
3: GetByEmployeeID
分析DataRepository.EmployeesProvider.GetAll()的操作:實例化的順序是
DataRespository 類里面維護了一個全局的變量Current,這個Current實際上是
SqlDataProvider 的實例,而Current是DataProviderBase 類型,關系為:
DataProviderBase
SqlDataProvider
(from sqlclient)
在DataRepository 中獲取EmployeesProvider的時候,實際上是調用了
SqlDataProvider 里面的方法EmployeesProvider(),new 了一個SqlEmployeesProvider 實
例,而這個實例中所有的方法的實現在SqlEmployeesProviderBase類中實現的,因為
SqlEmployeesProvider繼承了SqlEmployeesProviderBase類,這個類相當于是dao 層,直接進行
數據庫操作。
SqlEmployeesProviderBase
EmployeesProviderBase
(from base)
SqlEmployeesProvider
在生成各個sqlprovider 實例的時候,需要先實例化SqlDataProvider,這個用的是
Activator 類根據配置文件提供的這個類的名字生成的,nettier為了做到對不同數據庫的支
持,提供了一個配置文件nettiersconfigdata.config 和讀取這個配置文件的dll:
NetTiers.Configuration.dll。
Activator 類可以動態構造對象,有點像Java里面的
Class.forName(ClassName).newInstance()語句,因為用Activator 類構造對象,其類名在
編譯時可以不確定,所以可以用來做插件的接口,做出Winamp 那種可以外加DLL 插件的程序
來。
1.3. 調用接口的方法:
1.3.1. 獲取所有數據
獲取所有的Employee數據,按照LastName字段進行排序:
using Northwind.DataAccessLayer;
// Get all the employee, sort it on the LastName and print them out
TList<Employees> employees = DataRepository.EmployeeProvider.GetAll();
employees.Sort(EmployeeColumns.LastName, ListSortDirection.Ascending);
foreach(Employee employee in employees)
{
Console.WriteLine("{1} {0}", employee.FirstName, employee.LastName);
}
1.3.2. 新增數據
創建一個新的employee 并且保存
using Northwind.DataAccessLayer;
// Create a new record and save
Employee employee = new Employee();
employee.FirstName = "John";employee.LastName = "Doe";
employee.BirthDate = DateTime.Now;employee.Address = "10 , fake street";
employee.City = "Metroplolis";employee.Country = "USA";
employee.HireDate = DateTime.Now;
employee.HomePhone = "0123456789";
employee.Notes = "This is a fake employee";
employee.Title = "M";
employee.TitleOfCourtesy = "Dear";
employee.PostalCode = "5556";
employee.Region = "New-York";
DataRepository.EmployeeProvider.Insert(employee);
//look, new id already populated
Console.WriteLine("New Employee ID" + employee.EmployeeId);
1.3.3. 修改數據
按照下標獲取數據并且修改數據;
using Northwind.DataAccessLayer;
// Select by Index and Update
TList<Employees> employees =
DataRepository.EmployeeProvider.GetByLastName("Doe");
if (employees.Count == 1)
{
employees[0].Notes = "This is a modified fake employee";
DataRepository.EmployeeProvider.Save(employees[0]);
Console.Write(employees[0]);
}
1.3.4. 刪除數據
通過主鍵查詢數據并且刪除
using Northwind.DataAccessLayer;
// Select by primary key and Delete
// (Demonstrate that insert, update, delete methods can also take collection
as parameter)
Employee employee = SqlDataRepository.EmployeeProvider.GetByEmployeeID(13);
DataRepository.EmployeeProvider.Delete(employees);
1.3.5. 事務控制
事務控制實例,可以用事務控制插入、修改、刪除的操作,保證全部成功或者失敗回滾;
using Northwind.DataAccessLayer;
// The SqlClient can work with transactions.
// Also show the Save method, wich encapsulate the use of Insert, Update and
Delete methods.
TransactionManager transaction = DataRepository.CreateTransaction();
transaction.BeginTransaction(/*IsolationLevel.ReadUncommited*/);
try
{
// Insert
Employee employee = new Employee();
employee.FirstName = "John";
employee.LastName = "Doe";
employee.BirthDate = DateTime.Now;
employee.Address = "10 , fake street";
employee.City = "Metroplolis";
employee.Country = "USA";
employee.HireDate = DateTime.Now;
employee.HomePhone = "0123456789";
mployee.Notes = "This is a fake employee";
employee.Title = "M";
employee.TitleOfCourtesy = "Doctor";
employee.PostalCode = "5556";
employee.Region = "New-York";
DataRepository.EmployeeProvider.Save(transaction, employee);
// modify the employee instance
employee.Notes = "This is a modified fake employee";
// Update
DataRepository.EmployeeProvider.Save(transaction, employee);
transaction.Commit();
Console.WriteLine("ok");
}
catch(Exception ex)
{
try { transaction.Rollback();} catch(){}
Console.WriteLine("nok : {0}", ex);
}
1.3.6. 關聯保存
深度保存,可以同時保存父對象和子集
/*
DeepSave helper method can help you to save an object and its children in
one call.
*/
using Northwind.DataAccessLayer;
Order order = Order.CreateOrder("ALFKI", 1, DateTime.Now, DateTime.Now,
DateTime.Now, 1, 0.1m, "ship name", "ship address" , "paris", "idf", "75000",
"france");
order.OrderDetailCollection.Add(order.OrderID, 1, 15.6m, 10, 0.02f);
order.OrderDetailCollection.Add(order.OrderID, 2, 122.6m, 43, 0.03f);
DataRepository.OrderProvider.DeepSave(order);
Console.WriteLine("new order saved: orderId is: " + order.OrderID.ToString());
1.3.7. 多數據庫支持
同時支持多個不同的數據庫進行操作,在el 配置文件中配置不同的數據庫連接或者在代
碼中動態生成不同的數據庫連接,達到同時使用不同類型數據庫的目的。
/*
You can configure multiple data provider in the configuration console, and
write code to acces a specific one, instead of the default.
*/
using Northwind.DataAccessLayer;
SqlDataProvider myRepository = DataRepository.Providers["my second data
provider"] as Northwind.DataAccessLayer.SqlClient.SqlDataProvider;
this.listBox1.DataSource = myRepository.ProductProvider.GetAll();
this.listBox1.DisplayMember = "ProductName";
this.listBox1.ValueMember = "ProductID";
//Or if you can't have it pre-configured, you can change the connection
string at runtime.
using Northwind.DataAccessLayer;
//New syntax using a declared connection string:
TList<Products> list =
DataRepository.Connections["NorthwindConnectionString2"].Provider.CustomersProvide
r.GetAll();
//New syntax using a dynamic connection string:
DataRepository.AddConnection("DynamicConnectionString", "Data
Source=(local);Initial Catalog=Northwind;Integrated Security=true;");
TList<Products< list =
DataRepository.Connections["DynamicConnectionString"].Provider.ProductsProvider.Ge
tAll();
this.listBox1.DataSource = list;
this.listBox1.DisplayMember = "ProductName";
this.listBox1.ValueMember = "ProductID";
1.4. 配置nettiers模板
1.4.1. Datasource目錄:
SourceDatabase 數據庫名字和連接參數,在codesmith explore中有配置界面彈出
SourceTables 在數據表里面需要實體化的表
EntireDatabase 明確在數據庫中需要實體化的表,這個設置將取代SourceTables 的設置
1.4.2. General 目錄
OuputDirectory 輸出目錄,在codesmith explore里面有配置界面彈出
BusinessLogicLayerFolderName 邏輯層子目錄名,推薦置空
DataAccessLayerFolderName 數據層子目錄名,推薦值:DataAccessLayer
SqlFolderName 存儲過程腳本目錄名,推薦:SQL
NameSpace 項目的命名空間,名稱和目錄同。
GenerateUnitTest 聲明生成nunit測試項目名
VsNetIntegration 聲明是整個的生成一個工程還是按層分開生成工程
VsNetVersion Vs.net的版本
1.4.3. Webservice參數
GenerateWebService 聲明是否生成webservice服務
WebServiceOutputPath Webservice的生成文件路徑
WebServiceUrl 數據層子目錄名,推薦值:DataAccessLayer
SqlFolderName 指向WebServiceOutputPath 的url
配置完成后可以保存為配置文件,下次只需要載入即可。
新增了web層的模板,叫weblayer,實現單表的增刪改查;
給一個配置好的例子,對sqlserver2000的數據庫northwind的配置例子,見netier目錄下面
property.xml文件,可以直接載入然后生成對應的代碼,生成的是完整的工程,可以直接編譯
運行。??
總結
以上是生活随笔為你收集整理的NetTier模板生成的代码框架用法 (转)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#实现Web文件的上传
- 下一篇: Evidence gathering t