创建我自己的API

时间:2012-05-14 10:09:21

标签: salesforce apex-code visualforce

我在我的force.com应用程序Apex Classes中使用,其中许多具有相同的结构,我想制作一个API以便在之后重用它。

对于exaple,这是两个类:

//first class

public class insererActAct{

public List<Activites_actuelles__c> accts {get; set;}

public insererActAct(ApexPages.StandardController controller){
    accts = new List<Activites_actuelles__c>();
    accts.add(new Activites_actuelles__c());
}

public void addrow(){
    accts.add(new Activites_actuelles__c());

}

public PageReference deleteRow(){
   if (accts.size()>1)
   {
      accts.remove(accts.size()-1);
   }
   return null;
}

public PageReference save()
{
    insert accts;
    Assure__c theParent = new Assure__c(id=accts[0].Activites_actuelles__c);
    PageReference acctPage = new ApexPages.StandardController(theParent).view();
    acctPage.setRedirect(true);
    return acctPage;
}
}

//second class

public class insererEnfants{

public List<Enfants__c> accts {get; set;}

public insererEnfants(ApexPages.StandardController controller){
    accts = new List<Enfants__c>();
    accts.add(new Enfants__c());
}

public void addrow(){
    accts.add(new Enfants__c());

}

public PageReference deleteRow(){
   if (accts.size()>1)
   {
      accts.remove(accts.size()-1);
   }
   return null;
}

public PageReference save()
{
    insert accts;
    Assure__c theParent = new Assure__c(id=accts[0].Parent__c);
    PageReference acctPage = new ApexPages.StandardController(theParent).view();
    acctPage.setRedirect(true);
    return acctPage;
}
}

任何人都可以告诉我这是否可能,如果是的话,我该怎么办呢?

1 个答案:

答案 0 :(得分:4)

你的意思是你想编写适用于不同类型对象的代码,而不是在代码中陈述对象的类型吗?

可以通过使用sObject类型声明sObject变量来实现此目的,例如,而不是

public List<Activites_actuelles__c> accts {get; set;}

你会把

public List<sObject> sObjects{get; set;}

并使用get和put引用字段,例如而不是

Account theAccount = new Account();
theAccount.name = 'Fred';

你会把

sObject theSObject = new SObject();
theSObject.put('name', 'Fred');

我没有尝试在控制器扩展中使用这样的代码,但理论上,因为你可以传入任何标准控制器,你应该没问题。

您需要考虑如何在save方法中创建父对象,因为您需要传入要创建的类型。它非常复杂,但可以接受表示对象类型的字符串(例如“帐户”)并创建该类型的新对象:

Schema.getGlobalDescribe().get('Account').newSObject()

会为您提供一个新帐户。因此,您可以将“帐户”替换为作为参数传入的任何类型。

有关详细信息,请在文档中查找Dynamic Apex,Dynamic SOQL和Dynamic DML。

警告:将对象类型和字段名称作为字符串传递意味着编译器不会知道代码中提到的那些类型。因此,如果您尝试删除自定义对象或重命名字段,salesforce将不会警告您该对象或字段正在使用中,并允许您进行删除。

另一个警告:虽然这允许代码重用并且这是一个好处,但您可能会发现它不值得。除非我绝对必须,否则我会避免编写动态顶点。它比普通的顶点复杂得多,因此很难调试和保持,特别是如果你自己以外的人必须维护它。