internal void RegisterQueryFeature(Type channelType, Type queryFeatureType, QueryFeature qf)
        {
            Known(channelType);

            var channeId = channelType.FullName;

            if (!_channelFeaturesQuery.ContainsKey(channeId))
            {
                _channelFeaturesQuery[channeId] = new Dictionary <string, QueryFeature>();
            }

            var features  = _channelFeaturesQuery[channeId];
            var featureId = queryFeatureType.FullName;

            if (!features.ContainsKey(featureId))
            {
                features[featureId] = qf;
            }
            else
            {
                throw new TectureException($"Query feature {queryFeatureType.Name} is already implemented for {channelType.Name}");
            }

            qf._aux = _auxilary.ForChannel(channelType);
            qf.CallOnRegister();
        }
        internal void RegisterQueryAspect(Type channelType, Type queryAspectType, QueryAspect qf)
        {
            Known(channelType);

            var channeId = channelType.FullName;

            if (!_channelAspectQuery.ContainsKey(channeId))
            {
                _channelAspectQuery[channeId] = new Dictionary <string, QueryAspect>();
            }

            var aspects  = _channelAspectQuery[channeId];
            var aspectId = queryAspectType.FullName;

            if (!aspects.ContainsKey(aspectId))
            {
                aspects[aspectId] = qf;
            }
            else
            {
                throw new TectureException($"Query aspect {queryAspectType.Name} is already implemented for {channelType.Name}");
            }

            qf._aux = _auxilary.ForChannel(channelType);
            qf.CallOnRegister();
        }