It seems to me like it would be better to add an 'index' in EDProductGetter which returns the StreamID.value() for Events and in the future returns the 'index' of the Run or LuminosityBlock. In that way there is no separate 'getProductInStream' and instead you just use the getProduct.