Component-based software development (CBSD) is widely utilized to develop open CNC applications. It aims to build an open CNC application by composing a set of components, each implementing specific CNC sub-domain logic. Components conform to a certain component model to keep conformant interactive behaviors. Due to there is no standard granularity to decompose CNC domain and no general component model, as well as seldom consider extra-functional properties, components are heterogeneous. Moreover, they have a direct dependency rather than depending on abstractions. In a nutshell, there are many open-source CNC applications built by heterogeneous and tightly coupled components. They can implement CNC functionality but are good at functional extension and reconfiguration. In this paper, we apply CBSD and dependency inversion principle to develop a novel open CNC application which allows customizing CNC functionality. Specifically, a new granularity to decompose CNC domain is proposed. A special sub-domain is designed to encapsulate the execution logic of other sub-domains at an abstract level and instantiate concrete implementation details at runtime according to configuration. The functional properties of sub-domains are exposed via abstractions. Therefore, as long as re-writing the execution logic and configuring corresponding implementation details, CNC functionality can be extended or reconfigured. A prototype and several components have been developed to test the performance of the application.