diff --git a/README.md b/README.md index 66223a1..c464c49 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,14 @@ # Force DI -Generic [DI](https://en.wikipedia.org/wiki/Dependency_injection) library with support for injecting Apex, Visualforce and Lightning code at runtime. +Generic [dependency injection](https://en.wikipedia.org/wiki/Dependency_injection) (DI) library with support for injecting Apex, Visualforce, Lightning, and Flows at runtime. -Documentaiton +Documentation ------------- -- [General overview of the library features, configuration and use of Injectors](https://andyinthecloud.com/2018/07/15/managing-dependency-injection-within-salesforce/) -- [Using the library to aid with Test Driven Development in Apex](https://andyinthecloud.com/2018/07/29/test-driven-development-mocking-and-force-di/) -- [Dependency Injection, Flows, and Force DI](https://douglascayers.com/2018/08/05/dependency-injection-flows-and-force-di/) -- [Adopting Dependency Injection](https://douglascayers.com/2018/08/29/adopting-dependency-injection/) +- [General overview of the library features, configuration and use of Injectors](https://andyinthecloud.com/2018/07/15/managing-dependency-injection-within-salesforce/) (blog) +- [Using the library to aid with Test Driven Development in Apex](https://andyinthecloud.com/2018/07/29/test-driven-development-mocking-and-force-di/) (blog) +- [Dependency Injection, Flows, and Force DI](https://douglascayers.com/2018/08/05/dependency-injection-flows-and-force-di/) (blog) +- [Adopting Dependency Injection](https://douglascayers.com/2018/08/29/adopting-dependency-injection/) (webinar) +- [Understanding the Value of Dependency Injection in the Lightning Platform](https://www.youtube.com/watch?v=oce2QO-E_3k) (DF18 session) Project Folders --------------- diff --git a/force-app-1/main/customMetadata/DI_Binding.apex_RuntimeBindingDemoModule.md-meta.xml b/force-app-1/main/customMetadata/di_Binding.apex_RuntimeBindingDemoModule.md-meta.xml similarity index 87% rename from force-app-1/main/customMetadata/DI_Binding.apex_RuntimeBindingDemoModule.md-meta.xml rename to force-app-1/main/customMetadata/di_Binding.apex_RuntimeBindingDemoModule.md-meta.xml index cced16f..608b053 100644 --- a/force-app-1/main/customMetadata/DI_Binding.apex_RuntimeBindingDemoModule.md-meta.xml +++ b/force-app-1/main/customMetadata/di_Binding.apex_RuntimeBindingDemoModule.md-meta.xml @@ -2,6 +2,10 @@ false + + BindingObjectAlternate__c + + BindingObject__c diff --git a/force-app-1/main/customMetadata/DI_Binding.flow_GetString.md-meta.xml b/force-app-1/main/customMetadata/di_Binding.flow_GetString.md-meta.xml similarity index 86% rename from force-app-1/main/customMetadata/DI_Binding.flow_GetString.md-meta.xml rename to force-app-1/main/customMetadata/di_Binding.flow_GetString.md-meta.xml index 7b0bcd3..0264a5e 100644 --- a/force-app-1/main/customMetadata/DI_Binding.flow_GetString.md-meta.xml +++ b/force-app-1/main/customMetadata/di_Binding.flow_GetString.md-meta.xml @@ -2,6 +2,10 @@ false + + BindingObjectAlternate__c + + BindingObject__c diff --git a/force-app-1/main/flowDefinitions/HelloWorld.flowDefinition-meta.xml b/force-app-1/main/flowDefinitions/HelloWorld.flowDefinition-meta.xml deleted file mode 100644 index f520ee4..0000000 --- a/force-app-1/main/flowDefinitions/HelloWorld.flowDefinition-meta.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - 1 - diff --git a/force-app-1/main/flows/HelloWorld-1.flow-meta.xml b/force-app-1/main/flows/HelloWorld.flow-meta.xml similarity index 97% rename from force-app-1/main/flows/HelloWorld-1.flow-meta.xml rename to force-app-1/main/flows/HelloWorld.flow-meta.xml index 7fbbdf7..9522ebe 100644 --- a/force-app-1/main/flows/HelloWorld-1.flow-meta.xml +++ b/force-app-1/main/flows/HelloWorld.flow-meta.xml @@ -17,6 +17,7 @@ AutoLaunchedFlow Hello_World + Active flowString String diff --git a/force-app-2/main/customMetadata/DI_Binding.lc_ComponentAtoB.md-meta.xml b/force-app-2/main/customMetadata/DI_Binding.lc_ComponentAtoB.md-meta.xml deleted file mode 100644 index 397466f..0000000 --- a/force-app-2/main/customMetadata/DI_Binding.lc_ComponentAtoB.md-meta.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - false - - To__c - c:componentB - - - Type__c - LightningComponent - - diff --git a/force-app-2/main/customMetadata/DI_Binding.lc_actionWidgetNew.md-meta.xml b/force-app-2/main/customMetadata/DI_Binding.lc_actionWidgetNew.md-meta.xml deleted file mode 100644 index 1315ee3..0000000 --- a/force-app-2/main/customMetadata/DI_Binding.lc_actionWidgetNew.md-meta.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - false - - To__c - c:widgetWizard - - - Type__c - LightningComponent - - diff --git a/force-app-2/main/customMetadata/DI_Binding.apex_AccountTriggerAlertCustomer.md-meta.xml b/force-app-2/main/customMetadata/di_Binding.apex_AccountTriggerAlertCustomer.md-meta.xml similarity index 87% rename from force-app-2/main/customMetadata/DI_Binding.apex_AccountTriggerAlertCustomer.md-meta.xml rename to force-app-2/main/customMetadata/di_Binding.apex_AccountTriggerAlertCustomer.md-meta.xml index 8fccb0a..e6377ef 100644 --- a/force-app-2/main/customMetadata/DI_Binding.apex_AccountTriggerAlertCustomer.md-meta.xml +++ b/force-app-2/main/customMetadata/di_Binding.apex_AccountTriggerAlertCustomer.md-meta.xml @@ -2,6 +2,10 @@ false + + BindingObjectAlternate__c + + BindingObject__c Account diff --git a/force-app-2/main/customMetadata/DI_Binding.flow_AccountRecord.md-meta.xml b/force-app-2/main/customMetadata/di_Binding.flow_AccountRecord.md-meta.xml similarity index 86% rename from force-app-2/main/customMetadata/DI_Binding.flow_AccountRecord.md-meta.xml rename to force-app-2/main/customMetadata/di_Binding.flow_AccountRecord.md-meta.xml index c2f7ef0..2597c91 100644 --- a/force-app-2/main/customMetadata/DI_Binding.flow_AccountRecord.md-meta.xml +++ b/force-app-2/main/customMetadata/di_Binding.flow_AccountRecord.md-meta.xml @@ -2,6 +2,10 @@ false + + BindingObjectAlternate__c + + BindingObject__c diff --git a/force-app-2/main/customMetadata/DI_Binding.flow_AccountRecord_VF.md-meta.xml b/force-app-2/main/customMetadata/di_Binding.flow_AccountRecord_VF.md-meta.xml similarity index 87% rename from force-app-2/main/customMetadata/DI_Binding.flow_AccountRecord_VF.md-meta.xml rename to force-app-2/main/customMetadata/di_Binding.flow_AccountRecord_VF.md-meta.xml index b98ac0e..c95cecc 100644 --- a/force-app-2/main/customMetadata/DI_Binding.flow_AccountRecord_VF.md-meta.xml +++ b/force-app-2/main/customMetadata/di_Binding.flow_AccountRecord_VF.md-meta.xml @@ -2,6 +2,10 @@ false + + BindingObjectAlternate__c + + BindingObject__c diff --git a/force-app-2/main/customMetadata/di_Binding.lc_ComponentAtoB.md-meta.xml b/force-app-2/main/customMetadata/di_Binding.lc_ComponentAtoB.md-meta.xml new file mode 100644 index 0000000..c32c215 --- /dev/null +++ b/force-app-2/main/customMetadata/di_Binding.lc_ComponentAtoB.md-meta.xml @@ -0,0 +1,25 @@ + + + + false + + BindingObjectAlternate__c + + + + BindingObject__c + + + + BindingSequence__c + + + + To__c + c:componentB + + + Type__c + LightningComponent + + diff --git a/force-app-2/main/customMetadata/di_Binding.lc_actionWidgetNew.md-meta.xml b/force-app-2/main/customMetadata/di_Binding.lc_actionWidgetNew.md-meta.xml new file mode 100644 index 0000000..0da3a5d --- /dev/null +++ b/force-app-2/main/customMetadata/di_Binding.lc_actionWidgetNew.md-meta.xml @@ -0,0 +1,25 @@ + + + + false + + BindingObjectAlternate__c + + + + BindingObject__c + + + + BindingSequence__c + + + + To__c + c:widgetWizard + + + Type__c + LightningComponent + + diff --git a/force-app-2/main/flowDefinitions/AccountRecordFlow.flowDefinition-meta.xml b/force-app-2/main/flowDefinitions/AccountRecordFlow.flowDefinition-meta.xml deleted file mode 100644 index 62c41b3..0000000 --- a/force-app-2/main/flowDefinitions/AccountRecordFlow.flowDefinition-meta.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - 3 - diff --git a/force-app-2/main/flowDefinitions/AccountRecordFlowVF.flowDefinition-meta.xml b/force-app-2/main/flowDefinitions/AccountRecordFlowVF.flowDefinition-meta.xml deleted file mode 100644 index 9c95567..0000000 --- a/force-app-2/main/flowDefinitions/AccountRecordFlowVF.flowDefinition-meta.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - 5 - diff --git a/force-app-2/main/flows/AccountRecordFlow-3.flow-meta.xml b/force-app-2/main/flows/AccountRecordFlow.flow-meta.xml similarity index 99% rename from force-app-2/main/flows/AccountRecordFlow-3.flow-meta.xml rename to force-app-2/main/flows/AccountRecordFlow.flow-meta.xml index 266475b..993763f 100644 --- a/force-app-2/main/flows/AccountRecordFlow-3.flow-meta.xml +++ b/force-app-2/main/flows/AccountRecordFlow.flow-meta.xml @@ -47,6 +47,7 @@ varDateTime: {!varDateTime} true Get_Account + Active recordId String diff --git a/force-app-2/main/flows/AccountRecordFlowVF-5.flow-meta.xml b/force-app-2/main/flows/AccountRecordFlowVF.flow-meta.xml similarity index 98% rename from force-app-2/main/flows/AccountRecordFlowVF-5.flow-meta.xml rename to force-app-2/main/flows/AccountRecordFlowVF.flow-meta.xml index 40a8382..38c4b19 100644 --- a/force-app-2/main/flows/AccountRecordFlowVF-5.flow-meta.xml +++ b/force-app-2/main/flows/AccountRecordFlowVF.flow-meta.xml @@ -31,6 +31,7 @@ In the Outputs tab, select the expected data type in the "Source" fiel Flow Get_Record_Id + Active Passing flow variables to an existing flow for reuse and to separate concerns of needing to use Binding Param invocable apex action to retrieve flow parameters in Visualforce context. Account_Record_Flow diff --git a/force-app-3/main/customMetadata/DI_Binding.apex_forceApp3Module.md-meta.xml b/force-app-3/main/customMetadata/di_Binding.apex_forceApp3Module.md-meta.xml similarity index 86% rename from force-app-3/main/customMetadata/DI_Binding.apex_forceApp3Module.md-meta.xml rename to force-app-3/main/customMetadata/di_Binding.apex_forceApp3Module.md-meta.xml index 0775e51..c8a1121 100644 --- a/force-app-3/main/customMetadata/DI_Binding.apex_forceApp3Module.md-meta.xml +++ b/force-app-3/main/customMetadata/di_Binding.apex_forceApp3Module.md-meta.xml @@ -2,6 +2,10 @@ false + + BindingObjectAlternate__c + + BindingObject__c diff --git a/force-di/main/classes/di_Injector.cls b/force-di/main/classes/di_Injector.cls index 80dfd32..6f41b8c 100644 --- a/force-di/main/classes/di_Injector.cls +++ b/force-di/main/classes/di_Injector.cls @@ -135,18 +135,22 @@ public class di_Injector { **/ private class CustomMetadataModule extends di_Module { + private string bindingObjectApiName = null; + public override void configure() { // TODO: Support Namespace for(di_Binding__mdt bindingConfig : - [select QualifiedAPIName, DeveloperName, NamespacePrefix, - Type__c, To__c, BindingObject__c, BindingSequence__c - from di_Binding__mdt]) { + [select QualifiedAPIName, DeveloperName, NamespacePrefix + , Type__c, To__c, BindingObject__c, BindingObject__r.QualifiedApiName + , BindingObjectAlternate__c, BindingSequence__c + from di_Binding__mdt]) { bind(bindingConfig.DeveloperName); type(bindingConfig.Type__c); - if(String.isNotBlank(bindingConfig.BindingObject__c)) { - Schema.DescribeSobjectResult[] results = Schema.describeSObjects(new String[] { bindingConfig.BindingObject__c.toLowerCase().trim() }); + if(String.isNotBlank(bindingConfig.BindingObject__c) || String.isNotBlank(bindingConfig.BindingObjectAlternate__c)) { + bindingObjectApiName = String.isNotBlank(bindingConfig.BindingObject__c) ? bindingConfig.BindingObject__r.QualifiedApiName.toLowerCase().trim() : bindingConfig.BindingObjectAlternate__c.toLowerCase().trim(); + Schema.DescribeSobjectResult[] results = Schema.describeSObjects(new String[] { bindingObjectApiName }); if(results.size() != 1) { - throw new InjectorException('Failed to find SObject ' + bindingConfig.BindingObject__c + ' referened by binding ' + bindingConfig.DeveloperName ); + throw new InjectorException('Failed to find SObject ' + bindingObjectApiName + ' referened by binding ' + bindingConfig.DeveloperName ); } bind(results[0].getSObjectType()); } diff --git a/force-di/main/layouts/di_Binding__mdt-Binding Layout.layout-meta.xml b/force-di/main/layouts/di_Binding__mdt-Binding Layout.layout-meta.xml index c6507f9..ad1abe1 100644 --- a/force-di/main/layouts/di_Binding__mdt-Binding Layout.layout-meta.xml +++ b/force-di/main/layouts/di_Binding__mdt-Binding Layout.layout-meta.xml @@ -45,6 +45,10 @@ Edit BindingObject__c + + Edit + BindingObjectAlternate__c + @@ -89,7 +93,7 @@ false false - 00hZ0000000qrei + 00h0m000000cQew 4 0 Default diff --git a/force-di/main/objects/di_Binding__mdt/fields/BindingObjectAlternate__c.field-meta.xml b/force-di/main/objects/di_Binding__mdt/fields/BindingObjectAlternate__c.field-meta.xml new file mode 100644 index 0000000..30e7d77 --- /dev/null +++ b/force-di/main/objects/di_Binding__mdt/fields/BindingObjectAlternate__c.field-meta.xml @@ -0,0 +1,13 @@ + + + BindingObjectAlternate__c + Use this field to specify the SObject API name to bind to when the "Binding Object" field does not list that particular SObject. Only specify the "Binding Object" field or this one; not both. + false + SubscriberControlled + Use this field to specify the SObject API name to bind to when the "Binding Object" field does not list that particular SObject. Only specify the "Binding Object" field or this one; not both. + + 255 + false + Text + false + diff --git a/force-di/main/objects/di_Binding__mdt/listViews/All.listView-meta.xml b/force-di/main/objects/di_Binding__mdt/listViews/All.listView-meta.xml new file mode 100644 index 0000000..b24c0db --- /dev/null +++ b/force-di/main/objects/di_Binding__mdt/listViews/All.listView-meta.xml @@ -0,0 +1,12 @@ + + + All + MasterLabel + BindingObject__c + BindingObjectAlternate__c + BindingSequence__c + To__c + Type__c + Everything + + diff --git a/force-di/main/objects/di_Binding__mdt/validationRules/BindObj_Or_BindObjAlt.validationRule-meta.xml b/force-di/main/objects/di_Binding__mdt/validationRules/BindObj_Or_BindObjAlt.validationRule-meta.xml new file mode 100644 index 0000000..1035922 --- /dev/null +++ b/force-di/main/objects/di_Binding__mdt/validationRules/BindObj_Or_BindObjAlt.validationRule-meta.xml @@ -0,0 +1,8 @@ + + + BindObj_Or_BindObjAlt + true + This validation rule ensures that only the "Binding Object" or the "Binding Object Alternate" field is specified and not both. + NOT( ISBLANK( BindingObject__c ) ) && NOT( ISBLANK( BindingObjectAlternate__c ) ) + Only specify the "Binding Object" field or the "Binding Object Alternate" field; not both. + diff --git a/sfdx-project.json b/sfdx-project.json index 066e595..6ffdddc 100644 --- a/sfdx-project.json +++ b/sfdx-project.json @@ -26,7 +26,7 @@ ], "namespace": "", "sfdcLoginUrl": "https://login.salesforce.com", - "sourceApiVersion": "43.0", + "sourceApiVersion": "44.0", "packageAliases": { "force-di": "0Ho1N000000GmaTSAS", "force-di@0.1.0-1": "04t1N000000Cr1fQAC",