Facade Pattern in Business Central - AL Language

Facade Pattern is a Design Pattern to hide complexity of the multiple sub systems by providing a simple interface to the client. This pattern involves a single codeunit which provides simple methods required by the client and delegates call to methods of existing internal codeunits.


Class Diagram

Facade pattern class diagram:

  • Subsystem: Each class / codeunit in Subsystems has some functionality that will be accessed by client using Facade.

  • Facade: This will be the interface for client to access complex subsystem.

  • Client: Client will access the subsystems using Facade


Facade: Sample Scenario

Let's take a simple scenario. Create a facade codeunit which will wrap the functionality to search an item by name, and to search a resource by name in two different codeunits (internal / subsystem).


Subsystem (ItemSearchImpl.Codeunit.al)

This is an internal codeunit. Methods in this codeunit can be accessed only within the current project / module. Internal access will ensure that it is not exposed to the Client.


codeunit 50130 "Item Search Impl"

{

    Access = Internal;



    procedure SearchItems(SearchText: Text[100]; Items: List of [Text[100]])

    var

        Item: Record Item;

    begin

        Item.SetFilter(Description, '@*' + SearchText + '*');

        if Item.FindSet() then

            repeat

                Items.Add(Item.Description);

            until Item.Next() = 0;

    end;

}

Subsystem (ResourceSearchImpl.Codeunit.al)

codeunit 50131 "Resource Search Impl"

{

    Access = Internal;



    procedure SearchResource(SearchText: Text[100]; Resources: List of [Text[100]])

    var

        Resource: Record Resource;

    begin

        Resource.SetFilter(Name, '@*' + SearchText + '*');

        if Resource.FindSet() then

            repeat

                Resources.Add(Resource.Name);

            until Resource.Next() = 0;

    end;

}




Facade codeunit (ItemResourceSearch.Codeunit.al)

This is a Facade codeunit which provides access to the functionalities in "Item Search Impl" and "Resource Search Impl" codeunits to the Client.

codeunit 50132 "Item / Resource Search"

{

    Access = Public;

    

    procedure SearchItems(SearchText: Text[100]; Items: List of [Text[100]])

    var

        ItemSearchImpl: Codeunit "Item Search Impl";

    begin

        ItemSearchImpl.SearchItems(SearchText, Items);

    end;



    procedure SearchResource(SearchText: Text[100]; Resources: List of [Text[100]])

    var

        ResourceSearchImpl: Codeunit "Resource Search Impl";

    begin

        ResourceSearchImpl.SearchResource(SearchText, Resources);

    end;

}

Module Architecture

Business Central Module Architecture has some special requirements. See Facade codeunit rules.


Conclusion

Using this Design Pattern, we can simplify the APIs of Business Central extension / module / project. The Facade codeunit should not be modified and should only be extended.


Happy Coding!!!


Source Code can be downloaded from GitHub


#MSDyn365 #MSDyn365BC #BusinessCentral #DynamicsNAV #DesignPatterns