extensions/Worker.Extensions.Rpc/src/RpcServiceCollectionExtensions.NetStandard.cs (45 lines of code) (raw):
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the MIT License. See License.txt in the project root for license information.
#if NETSTANDARD
using System;
using System.Collections.Generic;
using System.Linq;
using Grpc.Core;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.Options;
namespace Microsoft.Azure.Functions.Worker.Extensions.Rpc
{
/// <summary>
/// <see cref="IServiceCollection" /> extensions for RPC.
/// </summary>
public static partial class RpcServiceCollectionExtensions
{
private static void ConfigureCallInvoker(IServiceCollection services)
{
services.TryAddEnumerable(
ServiceDescriptor.Transient<IConfigureOptions<FunctionsGrpcOptions>, ConfigureOptions>());
}
private class ConfigureOptions : IConfigureOptions<FunctionsGrpcOptions>
{
private readonly IConfiguration _configuration;
public ConfigureOptions(IConfiguration configuration)
{
_configuration = configuration;
}
public void Configure(FunctionsGrpcOptions options)
{
IEnumerable<ChannelOption> channelOptions = _configuration.GetFunctionsHostMaxMessageLength() switch
{
int maxMessageLength => new[]
{
new ChannelOption(ChannelOptions.MaxReceiveMessageLength, maxMessageLength),
new ChannelOption(ChannelOptions.MaxSendMessageLength, maxMessageLength),
},
_ => Enumerable.Empty<ChannelOption>(),
};
Uri address = _configuration.GetFunctionsHostGrpcUri();
Channel c = new Channel(address.Host, address.Port, ChannelCredentials.Insecure, channelOptions);
options.CallInvoker = c.CreateCallInvoker();
}
}
}
}
#endif