对象属性解释、对象属性查询

 

三层架构、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则,对象属性查询器实现起来就很简单了。

 

但是此种写法全部是弱引用,属性变化时引发的错误只能是运行时才能发现。

 

备注:以上接口仅为描述用,具体写法可以根据实际情况决定。

 

原文地址:https://www.cnblogs.com/rock_chen/p/1719897.html