public static bool RegisterProtocolFactory(this BaseProtocolFactory pFactory)
        {//1. Test to see if this factory is already registered
            if (_factoriesById.ContainsKey(pFactory.Id))
            {
                Logger.FATAL("Factory id {0} already registered", pFactory.Id);
                return(false);
            }
            //2. Test to see if the protocol chains exported by this factory are already in use
            if (pFactory.HandledProtocolChains.Any(x => _factoriesByChainName.ContainsKey(x)))
            {
                Logger.FATAL("protocol chain  already handled by factory ");
                return(false);
            }
            //3. Test to see if the protocols exported by this factory are already in use
            if (pFactory.HandledProtocols.Any(x => _factoriesByProtocolId.ContainsKey(x)))
            {
                Logger.FATAL("protocol  already handled by factory ");
                return(false);
            }
            //4. Register everything
#if PARALLEL
            pFactory.HandledProtocolChains().AsParallel().ForAll(x => _factoriesByChainName[x] = pFactory);
            pFactory.HandledProtocols().AsParallel().ForAll(x => _factoriesByProtocolId[x]     = pFactory);
#else
            foreach (var handledProtocolChain in pFactory.HandledProtocolChains)
            {
                _factoriesByChainName[handledProtocolChain] = pFactory;
            }
            foreach (var handledProtocol in pFactory.HandledProtocols)
            {
                _factoriesByProtocolId[handledProtocol] = pFactory;
            }
#endif
            _factoriesById[pFactory.Id] = pFactory;
            return(true);
        }