async Task Process(string messageId, Outgoing outgoing, string name, DateTime expiry) { if (outgoing.AsyncStreamFactory != null) { var stream = await outgoing.AsyncStreamFactory().ConfigureAwait(false); await ProcessStream(messageId, name, expiry, stream, outgoing.Metadata).ConfigureAwait(false); return; } if (outgoing.StreamFactory != null) { await ProcessStream(messageId, name, expiry, outgoing.StreamFactory(), outgoing.Metadata).ConfigureAwait(false); return; } if (outgoing.StreamInstance != null) { await ProcessStream(messageId, name, expiry, outgoing.StreamInstance, outgoing.Metadata).ConfigureAwait(false); return; } if (outgoing.AsyncBytesFactory != null) { var bytes = await outgoing.AsyncBytesFactory().ConfigureAwait(false); await persister.SaveBytes(messageId, name, expiry, bytes, outgoing.Metadata) .ConfigureAwait(false); return; } if (outgoing.BytesFactory != null) { await persister.SaveBytes(messageId, name, expiry, outgoing.BytesFactory(), outgoing.Metadata) .ConfigureAwait(false); return; } if (outgoing.BytesInstance != null) { await persister.SaveBytes(messageId, name, expiry, outgoing.BytesInstance, outgoing.Metadata) .ConfigureAwait(false); return; } throw new Exception("No matching way to handle outgoing."); }