using Grpc.Core; using MessagePack; using System; namespace MagicOnion.Client { public static class MagicOnionClient { static readonly IClientFilter[] emptyFilters = Array.Empty(); public static T Create(Channel channel) where T : IService { return Create(new DefaultCallInvoker(channel), MessagePackSerializer.DefaultOptions, emptyFilters); } public static T Create(CallInvoker invoker) where T : IService { return Create(invoker, MessagePackSerializer.DefaultOptions, emptyFilters); } public static T Create(Channel channel, IClientFilter[] clientFilters) where T : IService { return Create(new DefaultCallInvoker(channel), MessagePackSerializer.DefaultOptions, clientFilters); } public static T Create(CallInvoker invoker, IClientFilter[] clientFilters) where T : IService { return Create(invoker, MessagePackSerializer.DefaultOptions, clientFilters); } public static T Create(Channel channel, MessagePackSerializerOptions serializerOptions) where T : IService { return Create(new DefaultCallInvoker(channel), serializerOptions, emptyFilters); } public static T Create(CallInvoker invoker, MessagePackSerializerOptions serializerOptions) where T : IService { return Create(invoker, serializerOptions, emptyFilters); } public static T Create(CallInvoker invoker, MessagePackSerializerOptions serializerOptions, IClientFilter[] clientFilters) where T : IService { if (invoker == null) throw new ArgumentNullException(nameof(invoker)); var ctor = MagicOnionClientRegistry.consturtor; if (ctor == null) { #if ((ENABLE_IL2CPP && !UNITY_EDITOR) || NET_STANDARD_2_0) throw new InvalidOperationException("Does not registered client factory, dynamic code generation is not supported on IL2CPP. Please use code generator(moc)."); #else var t = DynamicClientBuilder.ClientType; return (T)Activator.CreateInstance(t, invoker, serializerOptions, clientFilters); #endif } else { return ctor(invoker, serializerOptions, clientFilters); } } } public static class MagicOnionClientRegistry where T : IService { public static Func consturtor; public static void Register(Func ctor) { consturtor = ctor; } } }