三層架構、MVC、領域設計等等要解決的問題就是各行其道,業務做業務的事情,顯示做顯示的事情,這個大家都能理解。他們之間的該如何協助每個人的理解都不一樣,這裡我提供一種方法,供大家參考。
我們知道,領取驅動設計提供了一種分類方法,使得我們有效區分不同對象,其中部分值對象或引用對象給使用者提供用於展現,倉儲或服務為使用者提供業務支撐。編程人員依據對象編寫介面。這個過程沒有問題,問題出現在細節上。
三個對象
|
表 |
欄位 |
|
|
Employee(員工) |
|
|
|
|
EmployeeId |
|
|
|
DepartId |
|
|
|
EmployeeName |
|
|
Depart(部門) |
DepartId |
|
|
|
DepartName |
|
|
Salary(工資) |
|
|
|
|
EmployeeId |
|
|
|
TypeName |
JBGZ(基本工資)
GWGZ(崗位工資) |
|
|
Money |
|
對象屬性解釋
以MVC為例,一般情況下編程時我們在介面中都是通過寫入程式碼在View中綁定資訊,例如Employee.EmployeeName,Employee.Depart.DepartName,對工資的取值需要一個迴圈。提交後在Controll中擷取值,然後又解析、賦值,比如:將介面的選擇的”開發部”從資料庫中檢索一下,然後取出Id賦值到Employee.DepartId上。就這樣相同功能的不同實現代碼開始蔓延。
這裡的所謂的對象屬性解譯器就是通過弱引用的關係實現動態取值,因為這樣取值的方式是可以抽象並枚舉出來。
interface IPropertyInterpreter
{
object GetPropertyValue(string propertyName);
void SetPropertyValue(string propertyName,object value);
}
在取值是我們可以用諸如這樣的方式
employeePropertyInterpreter.GetPropertyValue("EmployeeName");
employeePropertyInterpreter.GetPropertyValue("Department.DepartmentId");
employeePropertyInterpreter.GetPropertyValue("Salary.JBGZ");
employeePropertyInterpreter.GetPropertyValue("Salary.GWGZ");
Employee和Salary是一對多關聯性,但通過Salary.JBGZ(最終解釋為Salary.JBGZ.Money)可以直接存取和賦值,這樣的寫法更能表達出真實的語意。
employeePropertyInterpreter.SetPropertyValue("Department.DepartmentName", "開發部");
表達為:將當前員工的部門設定為開發部(前提“開發部”唯一)
對象屬性查詢
public interface IQuery
{
List<T> GetQuery<T>(string query);
}
提供屬性運算式查詢
employeeQuery.GetQuery<Employee>("EmployeeName='張' and Department.DepartmentName=開發部");
只要實現了對象屬性解譯器和對象屬性查詢器,就可以大大減輕View層的代碼編寫負擔,也為動態實現介面編程提供了可能。同時這種實現可以在不影響現有程式結構的情況下將此功能加上。如果基於Linq To SQL,EF則,對象屬性查詢器實現起來就很簡單了。
但是此種寫法全部是弱引用,屬性變化時引發的錯誤只能是運行時才能發現。
備忘:以上介面僅為描述用,具體寫法可以根據實際情況決定。