SObject UnitOfWork - wimvelzeboer/fflib-apex-extensions GitHub Wiki

SObject Unit of Work

Table of Contents

Basic methods

Creating new Records

fflib_ISObjectUnitOfWork unitOfWork = Application.UnitOfWork.newInstance();

Account record = new Account(Name = "My Account");
unitOfWork.registerNew(record);

unitOfWork.commitWork();

Updating records

fflib_ISObjectUnitOfWork unitOfWork = Application.UnitOfWork.newInstance();

Account accountRecord = [SELECT Name FROM Account LIMIT 1];
accountRecord.Name = 'Another Name';
unitOfWork.registerDirty(accountRecord);

unitOfWork.commitWork();

Deleting records

fflib_ISObjectUnitOfWork unitOfWork = Application.UnitOfWork.newInstance();

Account accountRecord = [SELECT Id FROM Account LIMIT 1];
unitOfWork.registerDeleted(accountRecord);

unitOfWork.commitWork();

Creating record Relations

Example with new records:

fflib_ISObjectUnitOfWork unitOfWork = Application.UnitOfWork.newInstance();

Account accountRecord = new Account(Name = "My Account");
unitOfWork.registerNew(accountRecord);

Contact contactRecord = new Contact(LastName = 'Smith');
unitOfWork.registerNew(contactRecord, Contact.AccountId, accountRecord);

unitOfWork.commitWork();

Example with existing records:

fflib_ISObjectUnitOfWork unitOfWork = Application.UnitOfWork.newInstance();

Account accountRecord = [SELECT Id FROM Account LIMIT 1];
Contact contactRecord = [SELECT Id FROM Contact LIMIT 1];

unitOfWork.registerDirty(contactRecords, Contact.AccountId, accountRecord);

unitOfWork.commitWork();

Sending Emails

fflib_ISObjectUnitOfWork unitOfWork = Application.UnitOfWork.newInstance();

Messaging.SingleEmailMessage message = new Messaging.SingleEmailMessage();
message.setOrgWideEmailAddressId(orgWideEmailAddressId);
message.setTemplateID(templateId);
message.setTargetObjectId(contract.Account__r.PersonContactId);
message.setWhatId(contract.Id);
message.setSaveAsActivity(true);

unitOfWork.registerEmail(message);
unitOfWork.commitWork();

Elevated UnitOfWork

public with sharing class MyService
{
    public void myMethod()
    {
        fflib_ISObjectUnitOfWork unitOfWork =
                Application.UnitOfWork.newInstance(new ElevatedDML());

        Account record = new Account(Name = "My Account");
        unitOfWork.registerNew(record);

        unitOfWork.commitWork();
    }

    public without sharing class ElevatedDML extends fflib_SObjectUnitOfWork.SimpleDML {}
}

Custom Hierarchy

public with sharing class MyService
{
    public void myMethod()
    {
        fflib_ISObjectUnitOfWork unitOfWork =
                Application.UnitOfWork.newInstance(
                        new List<Schema.SObjectType>
                        {
                            Account.SObjectType,
                            Contact.SObjectType
                        });

        Account accountRecord = new Account(Name = "My Account");
        unitOfWork.registerNew(accountRecord);

        Contact contactRecord = new Contact(LastName = 'Smith');
        unitOfWork.registerNew(contactRecord, Contact.AccountId, accountRecord);

        unitOfWork.commitWork();
    }
}

Usage in Service methods

public with sharing class AccountsServiceImpl
		implements IAccountsService
{
    public void setRating(Set<Id> ids, String rating)
    {
        setRating(Accounts.newInstance(ids), rating);
    }

    public void setRating(List<Account> records, String rating)
    {
        setRating(Accounts.newInstance(records), rating);
    }

    public void setRating(IAccounts accounts, String rating)
    {
        fflib_ISObjectUnitOfWork unitOfWork = Application.UnitOfWork.newInstance();
        setRating(unitOfWork, accounts, rating);
        unitOfWork.commitWork();
    }

    public void setRating(
            fflib_ISObjectUnitOfWork unitOfWork,
            IAccounts accounts,
            String rating)
    {
        accounts.setRating(rating);

        unitOfWork.registerDirty(accounts.getRecords());
    }

Dirty Fields

public void setRating(fflib_ISObjectUnitOfWork unitOfWork, IAccounts accounts, String rating)
{
    accounts.setRating(rating);

    unitOfWork.registerDirty(
        accounts.getRecords(),
        new List<SObjectField>{ Account.Rating });
}
⚠️ **GitHub.com Fallback** ⚠️