-
Notifications
You must be signed in to change notification settings - Fork 2
Difference
接包中的最佳实践所述,假如过一段时间,你又接到一个客户的定制ERP开发任务myErpForC1,他的需求与你现有的myErp设计很接近,但还是有些稍稍改动,这个时候我们当然不想复制一份myERP配置再修改(因为如果你这样做,那么myERP的所有bug修订和升级都要在新的配置下重新做一遍)。这是你可以这样建立目录。
-
myErp
- Customer
- form1.dcxml
- form2.dcxml
- list.dcxml
- Accounts
- form1.dcxml
- list.dcxml
- ...
- Customer
-
myErpForC1
- Customer
- form1_c1.dcxml
- ...
- Customer
我们新建了一个与myErp平齐的一个仓库:myErpForC1,让其依赖myErp。这样就可以形成差量化的配置。
差量化是此配置系统重要的特性。差量化本质上就是对已有的成果进行修正,例如,修改现有对象的属性,或新增一个对象。 与继承很类似,但区别在于,继承是创建一个新的对象修改,并不影响原对象,但二次开发没有创建新对象,修改影响了原对象。
下面的例子中,form1.dcxml是myErp的原有成果,由于二次开发不能直接修改这个文件,所以他定义了一个差量文件form1_c1.dcxml,就可以修改基础成果。
form1.dcxml
<?xml version="1.0" encoding="utf-8" ?>
<x:ObjectContainer
xmlns="clr-namespace:System.Configuration.Core.Tests,System.Configuration.Core.Tests"
xmlns:x="http://schemas.myerpsoft.com/configuration/2015"
x:namespace="company.erp.demo">
<TextBox x:name="f1" >
<Text>demo1</Text>
</TextBox>
<TextBox x:name="f3" >
<Text>demo3</Text>
</TextBox>
</x:ObjectContainer>form1_c1.dcxml
<?xml version="1.0" encoding="utf-8" ?>
<x:ObjectContainer
xmlns="clr-namespace:System.Configuration.Core.Tests,System.Configuration.Core.Tests"
xmlns:x="http://schemas.myerpsoft.com/configuration/2015"
x:namespace="company.erp.c1"
x:using="b:company.erp.demo">
<TextBox x:name="f2" >
<Text>demo2</Text>
</TextBox>
<TextBox x:name="b:f3" x:action="edit">
<Text>demo3 new</Text>
</TextBox>
</x:ObjectContainer>在上面的例子中,二次开发定义了新的f2对象,但也可以修改f3,使其Text属性改变为:demo3 new。
注意,f3对象的差量之所以能够有效,是因为两个配置公用同一个namespace:company.erp.demo和同一个package:customer
新的对象f2使用了新的namespace:company.erp.c1,不会影响原有的设计,即使myERP这个form1表单后期又发生改动增加了一个新的对象f2,也不会影响现有的二次开发。
为什么不能直接修改
DiffTest_1.dcxml? 因为基础开发商还会升级这个文件获得新功能,但如果二次开发商直接修改了这个文件,那么二次开发商要自己手动处理合并的问题(类似源代码管理的代码手动合并)。