It is a common feature to supply a list of available countries to the end user so that he or she chooses one. This list rarely changes, but it sometimes does, which is not in control of the company. One can regard this metadata as information retrieved from the interface layer, and it should not be part of the domain layer.
Contents
Problem
The problem which is addressed in this example is that the rate of change of the content of the value list is different than the lifecycle of the application itself. If these are coupled, then a new version of the application has to be created when the master data changes. When the master data changes is outside the span of control of the project. For a larger discussion on Master Data in different forms, see How to handle Master Data.
In our example of the municipalities, these change almost every year in the Netherlands. In 2005 467 municipalities existed and there were 458 municipalities in 2006. The general trend is there are less and less municipalities, and 2017 counted 388 municipalities.
An important aspect of this is that we want to maintain this list outside Blueriq, as it does not affect the behavior of the application (generally) and the data does not belong to the business for which we create the model. When the data changes, no new Blueriq application should have to traverse the DTAP street.
Solutions
Webservice
When there is a web service available which returns all municipalities as instances, then the Container type: AQ_InstanceLinker can simulate a value list. This pattern fulfills the requirement that the list is always up-to-date and that the model does not need changing when the list changes. This pattern is suitable for this amount of instances, but would not be if there would be much more municipalities, as otherwise too many instances would be present in the profile, reducing performance.
Unable to render {include} The included page could not be found.
External Value List
The external Value lists can be used to load the data, and is a pattern specifically aimed at large or quickly changing value lists. The data is not part of the profile and is updated when the server is restarted. Another advantage is that the model stays clean. Custom code is required to determine the possible values.
AQ_CsvConnectivityService
The Service call type: AQ_CsvConnectivityService can be used to load a CSV file into the profile. It is shown as value list with the Container type: AQ_InstanceLinker, similar as above. The main difference is that the CSV file is maintained by the project, and not by an external party. This can be both an advantage as well as a disadvantage.
Issues and considerations
For the municipality case, we advice to use the external Value list. Although the implementation effort may be somewhat larger because of the custom coding, it awoids a large number of instances in the profile. It also keeps the model clean, as no additional relations or containers are needed as are with solutions which use the Container type: AQ_InstanceLinker.