Self-adaptive behaviors in the context of Component-based Architecture are generally designed based on past monitoring events, configurations (component assemblies) as well as behavioural programs defining the adaptation logics and invariant properties. Providing assurances on the navigation through the configuration space remains a challenge. That requires taking decisions on predictions on the possible futures of the system in order to avoid going into branches of the behavioural program leading to bad configurations. This article proposes the design of self-adaptive software components based on logical discrete control approaches, in which the self-adaptive behavioural models enriches component controllers with a knowledge not only on events, configurations and past history, but also with possible future configurations. We present Ctrl-F, a Domain-specific Language whose objective is to provide high-level support for describing these control policies. Ctrl-F is formally defined by translation to Finite State Automata, which allow for the exploration of behavioural programs by verification or Discrete Controller Synthesis, i.e., by automatically generating a controller to enforce correct self-adaptive behaviours. We integrate Ctrl-F with FraSCAti, a Service Component Architecture middleware platform and we illustrate the use of Ctrl-F by applying it to two case studies: a news web application and a mutual exclusive task workflow.