三层架构、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则,对象属性查询器实现起来就很简单了。
但是此种写法全部是弱引用,属性变化时引发的错误只能是运行时才能发现。
备注:以上接口仅为描述用,具体写法可以根据实际情况决定。