Skip to content
MyErpSoft edited this page Jan 23, 2018 · 6 revisions

二次开发的最佳实践

中的最佳实践所述,假如过一段时间,你又接到一个客户的定制ERP开发任务myErpForC1,他的需求与你现有的myErp设计很接近,但还是有些稍稍改动,这个时候我们当然不想复制一份myERP配置再修改(因为如果你这样做,那么myERP的所有bug修订和升级都要在新的配置下重新做一遍)。这是你可以这样建立目录。

  • myErp

    • Customer
      • form1.dcxml
      • form2.dcxml
      • list.dcxml
    • Accounts
      • form1.dcxml
      • list.dcxml
    • ...
  • myErpForC1

    • Customer
      • form1_c1.dcxml
    • ...

我们新建了一个与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? 因为基础开发商还会升级这个文件获得新功能,但如果二次开发商直接修改了这个文件,那么二次开发商要自己手动处理合并的问题(类似源代码管理的代码手动合并)。

Clone this wiki locally